Heim > Backend-Entwicklung > C++ > Warum gibt „std::match_results::size' nicht die Anzahl der Übereinstimmungen in einem String zurück?

Warum gibt „std::match_results::size' nicht die Anzahl der Übereinstimmungen in einem String zurück?

Barbara Streisand
Freigeben: 2024-11-07 22:16:02
Original
856 Leute haben es durchsucht

Why does `std::match_results::size` not return the number of matches in a string?

Was gibt std::match_results::size zurück und warum entspricht es nicht der Anzahl der Übereinstimmungen?

Der std Die Funktion ::match_results::size in C 11 gibt die Anzahl der Erfassungsgruppen plus eins für den gesamten Übereinstimmungswert zurück. In dem von Ihnen bereitgestellten Code:

<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;
}
Nach dem Login kopieren

Sie könnten erwarten, dass die Ausgabe 3 ist, da die Zeichenfolge „abc“ dreimal im Heuhaufen vorkommt. Die Ausgabe ist jedoch tatsächlich 1. Dies liegt daran, dass regex_search nur eine Übereinstimmung zurückgibt und size() die Anzahl der Erfassungsgruppen plus den gesamten Übereinstimmungswert zurückgibt.

In diesem Fall gibt es keine Erfassungsgruppen, also size() gibt 1 für den gesamten Übereinstimmungswert zurück. Wenn Sie alle Übereinstimmungen von „abc“ im Heuhaufen finden möchten, können Sie die Funktion std::regex_search mit mehreren Parametern verwenden:

<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;
}
Nach dem Login kopieren

Dieser Code durchsucht den Heuhaufen nach allen Übereinstimmungen von „abc“. und speichern Sie sie im Übereinstimmungsvektor. Die Funktion size() gibt dann die Anzahl der gefundenen Übereinstimmungen zurück, in diesem Fall 3.

Alternative Lösungen

Es gibt andere Methoden, um mehrere Übereinstimmungen zu finden eine Zeichenfolge. Eine Methode ist die Verwendung des 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;
}
Nach dem Login kopieren

Dieser Code gibt Folgendes zurück:

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
Nach dem Login kopieren

Eine andere Methode ist die Verwendung der Funktion 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>
Nach dem Login kopieren

Dieser Code gibt auch 3 zurück.

Das obige ist der detaillierte Inhalt vonWarum gibt „std::match_results::size' nicht die Anzahl der Übereinstimmungen in einem String zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage