簡體   English   中英

如何使用cpp的regex_iterator在第一場比賽時停止

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM