std::match_results::size() による正規表現一致のサイズの決定
std::match_results::size() は以下を提供します一致グループの数と正規表現一致内の完全な一致値についての洞察。その機能を詳しく見てみましょう。
C 11 コードでは、std::match_results::size() を使用して正規表現の一致に関する情報を取得します。一致全体と正規表現で指定されている可能性のあるキャプチャ グループを含むカウントを返します。ただし、提供される値は、予想される一致の数と異なる場合があります。
次の例を考えてみましょう:
<code class="cpp">std::string haystack("abcdefabcghiabc"); std::regex needle("abc"); std::smatch matches; std::regex_search(haystack, matches, needle); std::cout << matches.size() << std::endl;</code>
この場合、3 つの一致の結果が得られると予想できます。ただし、regex_search() は一致を 1 つだけ取得するため、受信するのは 1 だけです。 size() 関数は、キャプチャ グループの数と一致全体を報告します。
明確にするために、std::match_results は一致の詳細と検出されたサブ一致を保持します。正規表現検索が成功した場合、空にはなりません。これには一連の sub_match オブジェクトが含まれており、最初のオブジェクトは完全な一致を表します。 match_results オブジェクト内の他の sub_match オブジェクトは、正規表現 (括弧で示されています) 内のサブグループに対応します。
たとえば、次の正規表現を考えてみましょう。
<code class="cpp">"ab(c)"</code>
これには、次のようなキャプチャ グループがあります。文字「c」をトラップします。次のコードは std::regex_iterator を使用して複数の一致を検索し、文字列の破壊を防ぎます:
<code class="cpp">std::string str("abcdefabcghiabc"); std::regex rgx1("abc"); smatch smtch; while (regex_search(str, smtch, rgx1)) { std::cout << smtch[0] << std::endl; str = smtch.suffix().str(); }</code>
このコードは "abc" を 3 回出力します。
あるいは、std::sregex_iterator を次のようにすることもできます。
<code class="cpp">std::string s = "abcdefabcghiabc"; for (std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r); i != std::sregex_iterator(); ++i) { std::smatch m = *i; std::cout << "Match value: " << m.str() << "\n"; std::cout << " Capture: " << m[1].str() << "\n"; }</code>
このコードは、完全な一致値とキャプチャ値を出力し、std::match_results::size() の動作を完全に理解できるようにします。
以上が`std::match_results::size()` は正規表現内の一致の数をどのように決定するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。