Heim > Backend-Entwicklung > C++ > Hauptteil

Warum gibt „std::match_results::size' bei mehreren Übereinstimmungen in einer Regex-Suche 1 statt 3 zurück?

Patricia Arquette
Freigeben: 2024-11-04 20:48:02
Original
943 Leute haben es durchsucht

Why does `std::match_results::size` return 1 instead of 3 for multiple matches in a regex search?

std::match_results::size

In C ist std::match_results::size eine Funktion, die die Anzahl der Übereinstimmungen zurückgibt Gruppen plus die Gesamtübereinstimmung in einer Regex-Suche. Es ist wichtig zu beachten, dass nicht die Gesamtzahl der gefundenen Übereinstimmungen zurückgegeben wird.

In dem von Ihnen bereitgestellten Beispiel:

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

Sie haben erwartet, dass „matches.size()“ 3 zurückgibt, aber stattdessen , erhalten Sie 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 Erfassungsgruppe, daher beträgt die Größe 1 (die gesamte Übereinstimmung selbst).

Um mehrere Übereinstimmungen zu erhalten, können Sie std::regex_iterator verwenden, was im folgenden alternativen Code demonstriert wird:

<code class="cpp">std::regex rgx1("abc");
int i = 0;
smatch smtch;
while (regex_search(str, smtch, rgx1)) {
        std::cout << i << ": " << smtch[0] << std::endl;
        i += 1;
        str = smtch.suffix().str();
}</code>
Nach dem Login kopieren

Dieser Code zerstört die Eingabezeichenfolge, daher ist hier eine weitere Alternative mit std::sregex_iterator:

<code class="cpp">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';
}</code>
Nach dem Login kopieren

Dieser iteratorbasierte Ansatz behält die ursprüngliche Zeichenfolge bei und ermöglicht Ihnen gleichzeitig die Iteration durch die Streichhölzer.

Das obige ist der detaillierte Inhalt vonWarum gibt „std::match_results::size' bei mehreren Übereinstimmungen in einer Regex-Suche 1 statt 3 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