std::match_results::size は何を返しますか?また、一致の数に対応しないのはなぜですか?
std C 11 の ::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; }
では、文字列「abc」が干し草の山に 3 回出現するため、出力は 3 であると予想されるかもしれません。ただし、実際の出力は 1 です。これは、regex_search が 1 つの一致のみを返し、size() がキャプチャ グループの数に一致の値全体を加えた値を返すためです。
この場合、キャプチャ グループは存在しないため、 size() は、一致値全体に対して 1 を返します。干し草の山で「abc」に一致するものをすべて検索したい場合は、複数のパラメーターを指定して std::regex_search 関数を使用できます。
<code class="cpp">int main() { std::string haystack("abcdefabcghiabc"); std::regex needle("abc"); std::vector<std::smatch> matches; std::regex_search(haystack, needle, matches, std::regex_constants::match_continuous); std::cout << matches.size() << std::endl; }
このコードは、干し草の山で「abc」に一致するものをすべて検索します。そしてそれらを一致ベクトルに保存します。 size() 関数は見つかった一致の数を返します。この場合は 3 です。
代替ソリューション
複数の一致を見つけるには他の方法もあります。文字列。 1 つの方法は、std::sregex_iterator を使用することです:
<code class="cpp">int main() { std::regex r("ab(c)"); 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() << " at Position " << m.position() << '\n'; std::cout << " Capture: " << m[1].str() << " at Position " << m.position(1) << '\n'; } return 0; }
このコードは次を返します:
Match value: abc at Position 0 Capture: c at Position 2 Match value: abc at Position 6 Capture: c at Position 8 Match value: abc at Position 12 Capture: c at Position 14
もう 1 つの方法は、std::regex_match 関数を使用することです:
<code class="cpp">int main() { std::regex r("abc"); std::string s = "abcdefabcghiabc"; std::vector<std::string> matches; std::smatch match; while (std::regex_search(s, match, r)) { matches.emplace_back(match[0]); s = match.suffix().str(); } std::cout << matches.size() << std::endl; }</code>
このコードも 3 を返します。
以上が`std::match_results::size` が文字列内の一致の数を返さないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。