Heim  >  Artikel  >  Backend-Entwicklung  >  Warum gibt „std::match_results::size()“ 1 für einen regulären Ausdruck ohne Erfassungsgruppen zurück?

Warum gibt „std::match_results::size()“ 1 für einen regulären Ausdruck ohne Erfassungsgruppen zurück?

DDD
DDDOriginal
2024-11-05 02:25:01314Durchsuche

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

Größe von std::match_results

Frage:

Im folgenden C 11-Code , warum gibt match.size() 1 statt der erwarteten 3 zurück?

<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>

Antwort:

Die size()-Funktion von std::match_results gibt zurück die Anzahl der Erfassungsgruppen plus 1, was die vollständige Übereinstimmung angibt. In diesem Fall gibt es keine Erfassungsgruppen, daher beträgt die Größe 1.

Erklärung:

Die Funktion regex_search findet das erste Vorkommen des regulären Ausdrucks in der Eingabe Zeichenfolge. In diesem Fall wird „abc“ am Anfang der Zeichenfolge gefunden. Das Matches-Objekt enthält Informationen über die Übereinstimmung, einschließlich Capture-Gruppen.

Der bereitgestellte reguläre Ausdruck enthält jedoch keine Capture-Gruppen. Capture-Gruppen sind Klammern im regulären Ausdruck, die bestimmten Teilen der Eingabezeichenfolge entsprechen. Wenn Erfassungsgruppen verwendet würden, würde match.size() die Anzahl der Erfassungsgruppen plus 1 zurückgeben.

Mehrere Übereinstimmungen finden:

Um mehrere Übereinstimmungen zu finden, können Sie Folgendes tun Verwenden Sie einen alternativen Ansatz, der die Übereinstimmungen durchläuft:

<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>

Dieser Code gibt aus:

0: abc
1: abc
2: abc

Das obige ist der detaillierte Inhalt vonWarum gibt „std::match_results::size()“ 1 für einen regulären Ausdruck ohne Erfassungsgruppen zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn