7

Perlでは、これを行うことができます:

$text = '1747239';
@matches = ($text =~ m/(\d)/g);
# @matches now contains ('1', '7', '4', '7', '2', '3', '9')

C ++正規表現マッチングを使用して、この動作を複製し、すべての一致を含む一致セットを取得するための最良の方法は何ですか?

私は今これを持っています:-

compiledRegex = std::regex(regex, std::tr1::regex_constants::extended);
regex_search(text, results, compiledRegex);

int count = results.size();
// Alloc pointer array based on count * sizeof(mystruct).
for ( std::cmatch::iterator match = results.begin(); 
      match != results.end(); 
      ++match )
{
    // Do something with match;
}

ただし、これは最初の一致のみを提供します。これは、/ gがないPerlと同じように問題ありませんが、/g効果が必要です。

それで、それを行うための良い方法はありますか、それとも正規表現を何度も実行し続ける必要がありますか?

4

1 に答える 1

12

何度か電話する必要がありますregex_search。その戻り値は、さらに一致があるかどうかを示します。呼び出すたびに、新しい一致が得られます。results によって返されるイテレータは、正規表現で定義されたグループの部分一致を処理します。最初のエントリは常に一致全体です。それがあなたの場合の理由ですcount == 1

std::string::const_iterator text_iter = text.cbegin();
compiledRegex = std::regex(regex, std::tr1::regex_constants::extended);

while (regex_search(text_iter, text.end(), results, compiledRegex))
{
    int count = results.size();
    // Alloc pointer array based on count * sizeof(mystruct).
    for ( std::cmatch::iterator group = results.begin();
          group != results.end();
          ++group )
    {
        // If you uses grouping in your search here you can access each group
    }

   std::cout << std::string(results[0].first, results[0].second) << endl;
   text_iter = results[0].second;
}

それが役に立てば幸い

于 2011-05-26T11:38:03.813 に答える