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