ホームページ > バックエンド開発 > C++ > キャプチャ グループのない正規表現に対して `std::match_results::size()` が 1 を返すのはなぜですか?

キャプチャ グループのない正規表現に対して `std::match_results::size()` が 1 を返すのはなぜですか?

DDD
リリース: 2024-11-05 02:25:01
オリジナル
390 人が閲覧しました

Why does `std::match_results::size()` return 1 for a regex without capture groups?

std::match_results のサイズ

質問:

次の C 11 コード内、matches.size() は期待される 3 ではなく 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>
ログイン後にコピー

答え:

std::match_results の size() 関数は返されます。キャプチャ グループの数に 1 を加えたもので、完全一致を示します。この場合、キャプチャ グループがないため、サイズは 1 です。

説明:

regex_search 関数は、入力内で最初に出現した正規表現を検索します。弦。この場合、文字列の先頭で「abc」が検索されます。一致オブジェクトには、キャプチャ グループを含む一致に関する情報が含まれています。

ただし、指定された正規表現にはキャプチャ グループが含まれません。キャプチャ グループは、入力文字列の特定の部分と一致する正規表現内の括弧です。キャプチャ グループが使用されている場合、matches.size() はキャプチャ グループの数に 1 を加えた値を返します。

複数の一致の検索:

複数の一致を検索するには、次のようにします。一致を反復する別のアプローチを使用します:

<code class="cpp">int main() {
    std::regex r("abc");
    std::string s = "abcdefabcghiabc";
    int i = 0;
    std::sregex_iterator it(s.begin(), s.end(), r);
    std::sregex_iterator end;
    while (it != end) {
        std::smatch m = *it;
        std::cout << i++ << ": " << m.str() << std::endl;
        it++;
    }
    return 0;
}</code>
ログイン後にコピー

このコードは次のように出力します:

0: abc
1: abc
2: abc
ログイン後にコピー

以上がキャプチャ グループのない正規表現に対して `std::match_results::size()` が 1 を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート