1

テキスト内の正規表現の一致を見つけるために cpp regex ライブラリを使用しています。regex_iterator に渡す独自の反復子 (テキスト内の特定の文字をスキップするため) を作成しました。私の問題は、テキストで見つかったすべての一致を含む結果が返されることです。最初の一致が必要なだけなので、最初の一致が見つかった後でも regex_iterator にテキストの検索を続けさせたくありません。

また、これがcpp正規表現で不可能な場合、ブーストで可能ですか?

サンプルコード:

    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

2 番目の一致を見つけたくない場合は、インクリメントせず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() );
}

これはペアを返す関数で、最初の文字列は「何か見つかりましたか」、2 番目の文字列は見つかった文字列です (最初の文字列が true の場合)。代わりに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 に答える