HINWEIS : Wenn ich sage, regex [
meine ich die Regex [
]"[\0]"
]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:
[^
: Der Ausdruck enthielt ein ungültiges Escape-Zeichen oder ein nachfolgendes Escape.[^\n]
]
Es scheint der '
-Teil zu sein (Ändern in '\n'
'"\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 [^
transformiert zu werden, drosselt jedoch ... except as specified below.
]
. "\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?
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:
- Sei der MV von DecimalIntegerLiteral.
- Wenn i null ist, gebe den EscapeValue zurück, der aus einem & lt; NUL & gt; Zeichen (Unicode-Wert 0000).
- Gibt den EscapeValue zurück, der aus der Ganzzahl i besteht.
Hinweis: ... \ 0 repräsentiert die & lt; NUL & gt; Zeichen und kann nicht durch eine Dezimalziffer gefolgt werden.
Tags und Links javascript c++ regex c++11 ecma262