如何使String :: Find(是)省略这一点

时间:2013-12-04 05:44:58

标签: c++ string find

如果我有一个列表,其中包含4个节点(“this”;“测试示例”;“是某些东西”;“小”),我想找到每个字符串都有“是”(只有1个)积极的这个清单)。这个主题已被发布了很多次,我已经用它来帮助我这么做了。但是,我无法在任何地方看到我如何从积极的结果中省略“这个”。我可以使用string :: c_str,然后在我减少了更大的列表之后自己找到它。或者有没有办法可以使用string :: find_first_of?看起来似乎有更好的方法。谢谢。
编辑:我知道我可以省略一个特定的字符串,但我正在寻找更大的图片b / c我的列表相当大(例如:诗)。

for(it = phrases.begin(); it != phrases.end(); ++it)
{
    found = it->find(look);
    if(found != string::npos)
        cout << i++ << ". " << *it << endl;
    else
    {
        i++;
        insert++;
    }
}

3 个答案:

答案 0 :(得分:1)

只是为了澄清:你在为什么苦苦挣扎?

你想要做的是检查你发现的是一个单词(或短语)的开头,也是单词(或短语)的结尾

即。检查是否:

  • found等于phrases.beginfound之前的元素是空格
  • AND found之后的两个元素是空格OR phrases.end

编辑:您可以使用found访问找到的字符(将X替换为您找到的字符串的长度(look.length)

found = it->find(look);
if(found!=string::npos)
{
    if((found==0 || it->at(found-1)==' ')
        && (found==it->length-X || it->at(found+X)==' '))
    {
         // Actually found it
    }
} else {
    // Do whatever
}

答案 1 :(得分:0)

我没有意识到你只想匹配“是”。您可以使用std :: istringstream为您标记它:

std::string term("is");

for(std::list<std::string>::const_iterator it = phrases.begin();
    it != phrases.end(); ++it)
{
    std::istringstream ss(*it);
    std::string token;
    while(ss >> token)
    {
        if(token == term)
            std::cout << "Found " << token << "\n";
    }
}

答案 2 :(得分:0)

我们可以使用boost regex来搜索正则表达式。下面是一个示例代码。使用正则表达式可以创建复杂的seacrh模式。

#include <boost/regex.hpp> 
#include <string> 
#include <iostream> 
#include  <boost/tokenizer.hpp>

using namespace boost;
using namespace std;

int main()
{
  std::string list[4] = {"this","hi how r u ","is this fun is","no"};

  regex ex("^is"); 

  for(int x =0;x<4;++x)
  {
    string::const_iterator start, end;
    boost::char_separator<char> sep(" ");
    boost::tokenizer<boost::char_separator<char> > token(list[x],sep);

    cout << "Search string:  " << list[x] <<"\n"<< endl;
    int x = 0;
    for(boost::tokenizer<boost::char_separator<char> >::iterator itr = token.begin();
        itr!=token.end();++itr)
    {
      start = (*itr).begin();
      end = (*itr).end();

      boost::match_results<std::string::const_iterator> what;
      boost::match_flag_type flags = boost::match_default;

      if(boost::regex_search(start, end, what, ex, flags))
      {
        ++x;
        cout << "Found--> " << what.str() << endl;
      }
    }

    cout<<"found pattern "<<x <<" times."<<endl<<endl;
  }
  return 0;
}

输出:

  

搜索字符串:此

     

发现模式0次。

     

搜索字符串:嗨如何

     

发现模式0次。

     

搜索字符串:这很有趣

     

找到 - &GT;找到了 - &gt;发现模式2次。

     

搜索字符串:否

     

发现模式0次。