1

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

此外,如果这在 cpp 正则表达式中是不可能的,那么在 boost 中是否可能?

示例代码:

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

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

2 回答 2

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>,它可以更好地表达这一点,作为返回值。

于 2013-06-19T14:24:22.630 回答
1

实际上它看起来已经做了你想在这里看到的。不特指这一行

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() :  "";
于 2013-06-19T14:47:31.290 回答