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

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

Patricia Arquette
Patricia ArquetteOriginal
2024-11-04 20:48:02932Durchsuche

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>

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>

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>

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!

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