5

C ++ 11の新しい正規表現ライブラリのソースをいくつか見てきましたが、それらのほとんどは、構文、またはregex_matchやregex_searchなどのより基本的な使用法に重点を置いています。これらの記事は正規表現ライブラリの使用を開始するのに役立ちましたが、キャプチャグループの詳細を見つけるのに苦労しています。

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

#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;
}

の4番目の引数の値を変更する際に、std::sregex_token_iterator保持するサブマッチを制御して、残りのサブマッチを破棄するように指示できます。したがって、一致が属するキャプチャグループを見つけるには、キャプチャグループを繰り返し処理して、特定のグループに対してどの一致が破棄されないかを見つけることができます。

ただし、これは私にとって望ましくありません。バックグラウンドでキャッシュが実行されていない限り、の各構造がstd::sregex_token_iterator入力を渡して一致を再度見つけることを期待するためです(これが間違っている場合は誰かが私を修正してくださいが、これが最善です結論に達することができました)。

一致が属するキャプチャグループを見つけるためのより良い方法はありますか?それとも、サブマッチを繰り返すことが最善の行動方針ですか?

4

1 に答える 1

6

regex_iterator代わりに使用してください。match_resultsすべてのesを含む各試合にアクセスできますsub_match。ここで、試合がどのキャプチャグループに属しているかを確認できます。

于 2013-02-02T19:26:56.803 に答える