Sie erhalten 1
, weil regex_search
nur 1 Übereinstimmung zurückgibt und size()
zurückgibt die Anzahl der Capture-Gruppen + der gesamte Match-Wert.
Ihr matches
ist ...:
Objekt eines match_results -Typs (z. B. cmatch oder smatch), der von dieser Funktion mit Informationen zu den Trefferergebnissen gefüllt wird Alle Unterüberschriften gefunden.
Wenn [die Regex-Suche] erfolgreich ist, ist sie nicht leer und enthält eine Reihe von sub_match-Objekten: das erste sub_match -Element entspricht der gesamten Übereinstimmung, und wenn der Regex-Ausdruck Unterausdrücke enthält, die abgeglichen werden sollen (dh durch Klammern getrennte Gruppen), werden ihre entsprechenden Unterübereinstimmungen als successive sub_match-Elemente im match_results-Objekt gespeichert.
Hier ist ein Code, der mehrere Übereinstimmungen findet:
%Vor% Siehe IDEONE-Demo , die abc
3 Mal zurückgibt.
Da diese Methode die Eingabezeichenfolge zerstört, gibt es hier eine weitere Alternative basierend auf std::sregex_iterator
( std::wsregex_iterator
sollte verwendet werden, wenn Ihr Betreff ein Objekt std::wstring
ist):
Siehe IDEONE-Demo , Rückgabe
%Vor% Was fehlt, ist, dass matches
für jede Erfassungsgruppe mit einem Eintrag gefüllt ist (einschließlich der gesamten übereinstimmenden Teilzeichenkette als 0. Erfassung).
Wenn Sie
schreiben %Vor% Dann erhalten Sie matches.size()==2
, mit matches[0]=="abc"
und matches[1]=="b"
.
@ stribizhevs Lösung hat eine quadratische Worst-Case-Komplexität für gesunde reguläre Ausdrücke. Für wahnsinnige (z. B. "y *") endet es nicht. In einigen Anwendungen könnten diese Probleme DoS-Angriffe sein, die darauf warten, dass sie passieren. Hier ist eine feste Version:
%Vor%Nach meiner persönlichen Vorliebe findet dies n + 1 Übereinstimmungen einer leeren Regex in einer Zeichenkette der Länge n. Sie können die Schleife auch nach einer leeren Übereinstimmung beenden.
Wenn Sie die Leistung für eine Zeichenfolge mit Millionen von Übereinstimmungen vergleichen möchten, fügen Sie die folgenden Zeilen nach der Definition von str
hinzu (und vergessen Sie nicht, Optimierungen zu aktivieren), einmal für jede Version: