我正在使用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;
}
答案 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() : "";