2013-07-25 17 views
20

In der Regex unten bezeichnet \s ein Leerzeichen. Ich stelle mir den Regex-Parser vor, gehe durch den String und sehe \ und weiß, dass das nächste Zeichen speziell ist.Warum müssen Regex-Konstruktoren doppelt maskiert werden?

Dies ist jedoch nicht der Fall, da Doppel-Escapes erforderlich sind.

Warum ist das?

Gibt es ein konkretes Beispiel dafür, wie eine einzelne Flucht als etwas anderes falsch interpretiert werden könnte?

+0

Denken Sie daran, dass Java oder der Regexp-Konstruktor keine Klarstellung benötigen, es ist der Compiler (oder Parser). – GJK

+1

Um zu den bereits richtigen Antworten hinzuzufügen: Beachten Sie, dass Sie, wenn Sie ein RegExp-Literal in JavaScript schreiben, * nicht * den Backslash umgehen müssen, wie Sie vermuten würden: '/ (\ s | ^) /' –

Antwort

22

Sie erstellen den regulären Ausdruck, indem Sie eine Zeichenfolge an den RegExp-Konstruktor übergeben.

Sie müssen die \ so umgehen, dass Ihr String-Literal es als Daten ausdrücken kann, bevor Sie es in einen regulären Ausdruck umwandeln.

12

Innerhalb des Code, in dem Sie eine Zeichenfolge erstellen, ist der Backslash ein Javascript-Escape-Zeichen zuerst, was bedeutet, dass die Escape-Sequenzen wie \t, \n, \" wird usw. in ihr Javascript Gegenstück (Tabulator, neue Zeile übersetzt werden, Zitat usw.), und das wird ein Teil der Zeichenfolge gemacht werden. Double-Backslash steht für einen einzelnen umgekehrten Schrägstrich in der eigentlichen Zeichenkette selbst. Wenn Sie also einen Backslash in der Zeichenkette haben möchten, können Sie diesen zuerst entfernen.

Wenn Sie also eine Zeichenfolge generieren, indem Sie var someString = '(\\s|^)' sagen, erstellen Sie eine tatsächliche Zeichenfolge mit dem Wert (\s|^).

3

Der Regex benötigt eine Zeichenfolgendarstellung von \s, die in JavaScript mit dem Literal "\\s" erstellt werden kann.

Hier ist ein anschauliches Beispiel zu veranschaulichen, warum "\s" nicht genug:

alert("One backslash:   \s\nDouble backslashes: \\s");

Beachten Sie, wie ein extra \ vor \s die Ausgabe ändert.

3

\ wird in Strings verwendet, um Sonderzeichen zu vermeiden. Wenn Sie einen Backslash in Ihrer Zeichenkette haben möchten (z. B. für das \ in \ s), müssen Sie es über einen umgekehrten Schrägstrich verlassen. So wird \\.

EDIT: Auch musste es hier tun, weil \\ in meiner Antwort zu \.

Verwandte Themen