std::match_results::size() は何を返しますか?
C 11 では、std::match_results::size( ) 関数は、一致結果オブジェクト内のキャプチャ グループの数に 1 を加えたもの (一致全体) を返します。
次のコードを考えてみましょう:
<code class="cpp">#include <iostream> #include <string> #include <regex> int main() { std::string haystack("abcdefabcghiabc"); std::regex needle("abc"); std::smatch matches; std::regex_search(haystack, matches, needle); std::cout << matches.size() << std::endl; }</code>
このコードは、文字列 "abcdefabcghiabc" 内で最初に出現した部分文字列 "abc" を検索し、一致結果をmatches オブジェクトに保存します。 。驚いたことに、matches.size() を呼び出すと、3 (予想される一致数) ではなく 1 が返されます。
この動作は、regex_search() が 1 つの一致のみを返し、size() には完全な一致の両方が含まれるという事実によって説明されます。一致および任意のキャプチャ グループ。この場合、キャプチャ グループがないため、size() は 1 (完全一致のみ) を返します。
複数の一致の検索
複数の一致を検索してカウントするには、 std::sregex_iterator または std::wsregex_iterator (ワイド文字列の場合) を使用します。 std::sregex_iterator を使用した例を次に示します。
<code class="cpp">#include <iostream> #include <string> #include <regex> using namespace std; int main() { std::regex r("abc"); std::string s = "abcdefabcghiabc"; int count = 0; for (std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r); i != std::sregex_iterator(); ++i) { count++; } cout << "Number of matches: " << count << endl; }</code>
このコードは、文字列内のすべての "abc" の一致を反復処理し、それらをカウントします。
キャプチャ グループ
正規表現にキャプチャ グループ (括弧で囲まれた部分式) が含まれる場合、一致結果にはキャプチャ グループも含まれます。たとえば、「abc(def)」に一致する正規表現があり、入力文字列に「abcdef」が含まれている場合、一致結果のサイズは 2 (完全一致およびキャプチャ グループ「def」) になります。
以上がC では std::match_results::size() はいくつの項目を返しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。