繁体   English   中英

C ++中有替代的str.find吗?

[英]Is there alternative str.find in c++?

我有一个队列fifo类型(先进先出),里面有字符串。 每个字符串都是句子。 我需要在其中找到一个单词,并在控制台上显示它。 问题是,当我使用str.find(“ word”)时,它可以显示带有“ words”的句子。

添加空格和一些符号,例如“。,?!” = str.find(“ word”)等,但这不是解决方案

if (head != nullptr)
  do {
    if (head->zdanie_kol.find("promotion") != string::npos ||
        head->zdanie_kol.find("discount") != string::npos ||
        head->zdanie_kol.find("sale") != string::npos ||
        head->zdanie_kol.find("offer") != string::npos)
      cout << head->zdanie_kol << endl;
  } while (head != nullptr);

例如,我有两个句子,一个是正确的,另一个是不正确的。

正确:

我们为您提供了一个特别的电子邮件数据库,可以联系卖家和购物者的eBay成员。

不正确:

不要错过机会,注册并找到我们为您准备的超级促销!

我可以想到的三个最简单的解决方案是:

  1. 一旦得到结果,只需检查下一个字符。 如果是空格或'\\0' ,则找到了匹配项。 确保也事先检查过字符,以免在寻找word时与sword不符。 还要确保您没有读取超出字符串存储范围的内容。
  2. 首先标记字符串。 这会将句子分解成单词,然后您可以逐单词检查它是否匹配。 您可以使用strtok()完成此操作。
  3. 如评论中所述,使用正则表达式(例如regex_match() )。 取决于您选择的引擎,语法可能会有所不同,但是大多数语法都带有类似"\\\\bsale\\\\b" ,它们会在字边界上匹配(有关更多信息,请参见此处 )。

这是使用std::unordered_setstd::istringstream的解决方案:

#include <unordered_set>
#include <string>
#include <sstream>
//...
std::unordered_set<std::string> filter_word = {"promotion", "discount", "sale", "offer"};
//...
std::istringstream strm(head->zdanie_kol);
std::string word;
while (strm >> word)
{
    if (filter_word(word).count())
    {
        std::cout << head->zdanie_kol << std::endl;     
        break;
    }
}  
//...

如果要检查的单词更多而不是4个单词,则此解决方案似乎更易于使用,因为您要做的就是将这些单词添加到unordered_set

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM