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

时间:2019-05-23 00:18:11

标签: c++ string find

我有一个队列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会员联系买卖双方。

不正确:

  

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

2 个答案:

答案 0 :(得分:4)

为此我想到的三个最简单的解决方案是:

  1. 获得结果后,只需检查下一个字符即可。如果是空格或'\0',则说明您找到了匹配项。请务必先检查一下字符,以免在寻找sword时与word不符。另外,请确保您没有在字符串存储之外读取内容。
  2. 首先对字符串进行标记。这会将句子分解成单词,然后您可以逐单词检查它是否匹配。您可以使用strtok()进行此操作。
  3. 使用注释中提到的正则表达式(例如regex_match())。视您选择的引擎而定,语法可能有所不同,但大多数语法都类似于"\\bsale\\b",它将在单词边界上匹配(有关更多信息,请参见here)。

答案 1 :(得分:0)

这是使用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中。