[英]How to stop at first match using regex_iterator of cpp
我正在使用cpp regex庫在文本中查找正則表達式匹配。 我已經編寫了自己的迭代器(以跳過文本中的某些字符),並將其傳遞給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;
}
如果你不想找到第二個匹配,不要增加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>
作為返回值,它更好地表達了這一點。
實際上看起來它已經做了你想要的東西 。 不是這一行
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() : "";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.