如何使用cpp的regex_iterator在第一场比赛时停止

时间:2013-06-19 14:18:01

标签: c++ regex boost

我正在使用cpp regex库在文本中查找正则表达式匹配。我已经编写了自己的迭代器(以跳过文本中的某些字符),并将其传递给regex_iterator。我的问题是它返回包含文本中找到的所有匹配项的结果。我不希望regex_iterator在找到第一个匹配项后继续搜索文本,因为第一场比赛就是我所需要的。

如果在cpp regex中无法做到这一点,是否可以在boost?

示例代码:

    regex_iterator<MyIterator> rit ( cdogs, cdogs.end(), e );
    regex_iterator<MyIterator> rend;

    while (rit!=rend) {
        cout << rit->str() << std::endl;
        ++rit;
    }

2 个答案:

答案 0 :(得分:3)

如果您不想找到第二场比赛,请不要增加rit,而只是返回。

template<typename Dogs, typename E>
std::pair<bool, std::string> find_it( Dogs&& cdogs, E&& e ) {
  std::regex_iterator<MyIterator> rit ( cdogs, cdogs.end(), e );

  if (rit!=std::regex_iterator<MyIterator>()) {
    return std::make_pair( true, rit->str() );
  }
  return std::make_pair( false, std::string() );
}

这是一个返回一对的函数,第一个是“我找到了什么”,第二个是找到的字符串(如果第一个为真)。您可以使用boost::optional<std::string>作为返回值来更好地表达这一点。

答案 1 :(得分:1)

实际上看起来它已经做了你想做的事 see here。不是这一行

On construction, and on every increment, it calls std::regex_search and remembers the result

因此它只会计算增量指针的时间。话虽如此,你可以简单地做:

regex_iterator<MyIterator> rit ( cdogs, cdogs.end(), e );
regex_iterator<MyIterator> rend;
return rit != rend ? rit->str() :  "";