Ist \ 0 ("\\ 0" in einer Regex-Zeichenfolge im C-Stil) eine gültige Escape-Sequenz in regulären C ++ - Ausdrücken?

8

HINWEIS : Wenn ich sage, regex [["[\0]"]] meine ich die Regex std::__1::regex_error (nicht in einer C-style Zeichenfolge enthalten, die dann% co_de wäre %). Wenn ich keine Anführungszeichen verwendet habe, handelt es sich nicht um eine Zeichenfolge im C-Stil, und die umgekehrten Schrägstriche sollten nicht so interpretiert werden, als entgingen sie einer Zeichenfolge im C-Stil.

Inspiriert von dies Frage und meine Untersuchung habe ich den folgenden Code in clang 3.4 probiert:

%Vor%

Anscheinend gefällt das nicht, wie es klingt:

  

[^[^\n]] : Der Ausdruck enthielt ein ungültiges Escape-Zeichen oder ein nachfolgendes Escape.

Es scheint der ''\n'' -Teil zu sein (Ändern in "\0" oder etwas Ähnliches funktioniert gut). Es scheint ein ungültiger Escape-Charakter zu sein. Ich möchte klarstellen, dass ich nicht über das Zeichen "\n" (Nullzeichen) oder "\n" (Zeilenvorschubzeichen) spreche. In C-Style Strings, was ich spreche ist "\n" (eine Zeichenfolge mit Backslash Null) und "\0" (eine Zeichenfolge mit Backslash n). basic_regex scheint von der Regex-Engine in [^... except as specified below.] transformiert zu werden, drosselt jedoch "\0" .

Der C ++ 11-Standard sagt in Abschnitt 28.13 [re.grammar] folgendes:

  

Die von %code% -Objekten erkannte reguläre Ausdrucksgrammatik, die mit dem ECMAScript-Flag erstellt wurde, ist die von ECMA-262 angegebene, außer wie unten angegeben.

Ich bin kein Experte für ECMA-262, aber Ich habe den regulären Ausdruck auf JSFiddle versucht und es funktioniert dort gut JavaScript Land.

Nun frage ich mich, ob der Regex %code% in ECMA-262 gültig ist und der C ++ 11-Standard die Unterstützung für ihn entfernt hat (im folgenden %code% ).

Frage : Ist %code% (nicht das Nullzeichen; in einem Stringliteral wäre dies %code% ) Escape-Sequenz in einem regulären C ++ 11-Ausdruck zulässig? Ist es in ECMA-262 legal (oder sind Browser-JS-VMs einfach "zu" nachsichtig)? Was ist die Ursache / Begründung für die verschiedenen Verhaltensweisen?

    
Cornstalks 06.05.2014, 02:19
quelle

1 Antwort

2

Dies war ein Fehler in der libc ++ Implementierung von <regex> . Es sollte jetzt im Trunk behoben werden, und dies sollte sich schließlich auf den Release-Code von OS X übertragen.

Hier ist auch der Auszug aus dem ECMA 262 Standard, der die Grundlage für diesen Fehlerbericht bildet:

  

15.10.2.11 DecimalEscape

     

Die Produktion DecimalEscape :: DecimalIntegerLiteral [lookahead ∉ DecimalDigit] wird wie folgt ausgewertet:

     
  1. Sei der MV von DecimalIntegerLiteral.
  2.   
  3. Wenn i null ist, gebe den EscapeValue zurück, der aus einem & lt; NUL & gt; Zeichen (Unicode-Wert 0000).
  4.   
  5. Gibt den EscapeValue zurück, der aus der Ganzzahl i besteht.
  6.   

Hinweis: ... \ 0 repräsentiert die & lt; NUL & gt; Zeichen und kann nicht durch eine Dezimalziffer gefolgt werden.

    
Bill Lynch 21.05.2014, 17:40
quelle

Tags und Links