Warum schlägt bei libc ++ regex_match ("tournament", regex ("tour | to | turniere")) fehl?

8

In Ссылка , Der folgende Test existiert:

%Vor%

Warum sollte diese Übereinstimmung fehlschlagen?

Bei VC ++ 2012 und Boost ist die Übereinstimmung erfolgreich.
Bei Javascript von Chrome und Firefox ist "tournament".match(/^(?:tour|to|tournament)$/) erfolgreich.

Nur bei libc ++ schlägt die Übereinstimmung fehl.

    
ganaware 12.07.2013, 07:07
quelle

1 Antwort

5

Ich glaube, der Test ist korrekt. Es ist lehrreich, in allen libc ++ -Tests unter re.alg nach "Turnier" zu suchen und zu vergleichen, wie die verschiedenen Engines das regex("tour|to|tournament") behandeln und wie sich regex_search von regex_match unterscheidet.

Beginnen wir mit regex_search :

awk, egrep, erweitert:

%Vor%
  

entspricht der gesamten Eingabezeichenfolge: "Turnier".

ECMAScript:

%Vor%
  

stimmt nur mit einem Teil der Eingabezeichenfolge überein: "tour".

grep, basic:

%Vor%
  

Passt überhaupt nicht zusammen. Das '|' Charakter ist nicht besonders.

awk, egrep und extended werden so viel wie möglich mit Alternation zusammenpassen. Der ECMAScript-Wechsel ist jedoch "geordnet". Dies ist in ECMA-262 festgelegt. Sobald ECMAScript mit einer Verzweigung in der Alternation übereinstimmt, wird die Suche beendet. Der Standard enthält dieses Beispiel:

%Vor%
  

liefert das Ergebnis "a" und nicht "ab".

<plug>

Dies wird auch ausführlich in Reguläre Ausdrücke von Jeffrey E. F. Friedl besprochen. Ich hätte <regex> ohne dieses Buch nicht implementieren können. Und ich werde frei zugeben, dass es noch viel mehr gibt, was ich über reguläre Ausdrücke nicht weiß, als was ich weiß.

Am Ende des Kapitels über Alternation sagt der Autor:

  

Wenn Sie bei der ersten Lesung alles in diesem Kapitel verstanden haben   Wahrscheinlich hast du es gar nicht gelesen.

Glauben Sie es!

</plug>

Wie auch immer, ECMAScript passt nur zu "tour". Der regex_match -Algorithmus gibt nur Erfolg zurück, wenn die gesamte Eingabezeichenfolge übereinstimmt. Da nur die ersten 4 Zeichen der Eingabezeichenfolge übereinstimmen, gibt ECMAScript im Gegensatz zu awk, egrep und extended false mit einer nullgroßen cmatch zurück.

    
Howard Hinnant 12.07.2013, 15:59
quelle

Tags und Links