Heim > Backend-Entwicklung > C++ > Hauptteil

Wie bestimmt „std::match_results::size()' die Anzahl der Übereinstimmungen in einem regulären Ausdruck?

Mary-Kate Olsen
Freigeben: 2024-11-04 12:43:02
Original
205 Leute haben es durchsucht

How does `std::match_results::size()` determine the number of matches in a regular expression?

Bestimmen der Größe von Regex-Übereinstimmungen mit std::match_results::size()

std::match_results::size() bietet Einblicke in die Anzahl der Match-Gruppen und den vollständigen Match-Wert innerhalb eines Regex-Matches. Schauen wir uns seine Funktionalität genauer an.

Im C 11-Code wird std::match_results::size() verwendet, um Informationen über Regex-Übereinstimmungen zu erhalten. Es wird eine Zählung zurückgegeben, die die gesamte Übereinstimmung sowie alle Erfassungsgruppen umfasst, die möglicherweise im regulären Ausdruck angegeben wurden. Der bereitgestellte Wert kann jedoch von der erwarteten Anzahl an Übereinstimmungen abweichen.

Betrachten Sie das folgende Beispiel:

<code class="cpp">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

In diesem Fall können Sie mit einem Ergebnis von 3 Übereinstimmungen rechnen. Sie erhalten jedoch nur 1, da regex_search() lediglich eine Übereinstimmung abruft. Die Funktion size() meldet die Anzahl der Erfassungsgruppen plus die gesamte Übereinstimmung.

Zur Verdeutlichung: std::match_results enthält Übereinstimmungsdetails und alle entdeckten Unterübereinstimmungen. Wenn eine Regex-Suche erfolgreich ist, ist sie nicht leer. Es enthält eine Reihe von sub_match-Objekten, wobei das erste Objekt die vollständige Übereinstimmung darstellt. Andere sub_match-Objekte im match_results-Objekt entsprechen Untergruppen innerhalb des regulären Ausdrucks (angezeigt durch Klammern).

Betrachten Sie beispielsweise den folgenden regulären Ausdruck:

<code class="cpp">"ab(c)"</code>
Nach dem Login kopieren

Es gibt eine Erfassungsgruppe, die fängt das Zeichen „c“ ein. Der folgende Code verwendet std::regex_iterator, um mehrere Übereinstimmungen zu finden und so vor der Zerstörung von Zeichenfolgen zu schützen:

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

Dieser Code gibt „abc“ dreimal aus.

Alternativ kann std::sregex_iterator sein verwendet, was eine effizientere und stringschonendere Methode bietet:

<code class="cpp">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() << "\n";
    std::cout << "    Capture: " << m[1].str() << "\n";
}</code>
Nach dem Login kopieren

Dieser Code gibt die vollständige Übereinstimmung aus und Werte erfassen, was ein umfassendes Verständnis des Verhaltens von std::match_results::size() bietet.

Das obige ist der detaillierte Inhalt vonWie bestimmt „std::match_results::size()' die Anzahl der Übereinstimmungen in einem regulären Ausdruck?. 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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!