ホームページ  >  記事  >  バックエンド開発  >  C では std::match_results::size() はいくつの項目を返しますか?

C では std::match_results::size() はいくつの項目を返しますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-08 13:40:02498ブラウズ

How Many Items Does std::match_results::size() Return in C  ?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。