Was gibt std :: match_results :: size zurück?

8

Ich bin etwas verwirrt über den folgenden C ++ 11 Code:

%Vor%

Ich würde erwarten, dass es 3 ausgibt, aber stattdessen bekomme ich 1 . Fehle ich etwas?

    
Morpheu5 24.09.2015, 15:39
quelle

3 Antworten

9

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):

%Vor%

Siehe IDEONE-Demo , Rückgabe

%Vor%     
Wiktor Stribiżew 24.09.2015, 15:46
quelle
3

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" .

    
Toby Speight 24.09.2015 15:59
quelle
0

@ 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:

%Vor%     
Arne Vogel 25.09.2015 10:32
quelle

Tags und Links