2013-02-02 7 views
5

C++ 11の新しいregexライブラリのソースをいくつか見てきましたが、そのほとんどは構文やregex_matchなどの基本的な使い方に焦点を当てています。またはregex_search。これらの記事はregexライブラリの使用を開始するのに役立ちましたが、キャプチャグループの詳細を見つけるのは困難です。C++ 11 Regexはキャプチャグループ識別子を見つける

私が達成しようとしているのは、一致するキャプチャグループがどれかを見つけることです。これまでのところ、私はこれを行うための単一の方法しか見つけませんでした。

#include <iostream> 
#include <string> 
#include <regex> 

int main(int argc, char** argv) 
{ 
    std::string input = "+12 -12 -13 90 qwerty"; 
    std::regex pattern("([+-]?[[:digit:]]+)|([[:alpha:]]+)"); 

    auto iter_begin = std::sregex_token_iterator(input.begin(), input.end(), pattern, 1); 
    auto iter_end = std::sregex_token_iterator(); 

    for (auto it = iter_begin; it != iter_end; ++it) 
    { 
     std::ssub_match match = *it; 
     std::cout << "Match: " << match.str() << " [" << match.length() << "]" << std::endl; 
    } 

    std::cout << std::endl << "Done matching..." << std::endl; 
    std::string temp; 
    std::getline(std::cin, temp); 

    return 0; 
} 

std::sregex_token_iteratorの四番目の引数の値を変更することで、私はそれが彼らの残りの部分を捨てて、それを言って、維持する部分マッチを制御することができます。したがって、マッチがどのキャプチャグループに属しているかを調べるには、キャプチャグループを繰り返して、特定のグループに対してどのマッチが捨てられていないかを調べるだけです。これがあれば、バックグラウンドで起こっているいくつかのキャッシュがありますしない限り、私は再び試合を入力の上を通過して見つけることstd::sregex_token_iteratorの各建設を期待しているため

しかし、これは、私にとっては望ましくないであろう(誰かが私を修正してください間違っていますが、これは私が来ることができる最高の結論です)。

マッチが所属するキャプチャグループを見つける良い方法はありますか?または、部分的な作業を繰り返し実行している最中ですか?

答えて

5

代わりにregex_iteratorを使用してください。それぞれの試合にmatch_resultsにアクセスできます。この試合にはsub_matchがすべて含まれています。ここで、一致するキャプチャグループを確認できます。

+0

本当にありがとうございました、私は期待していました。 – TheCodeBroski

関連する問題