2017-02-03 1 views
-2

Verwenden Sie diese Zeichenfolge als BeispielWarum unterscheidet sich die Escape-Syntax zwischen zwei Javascript-Funktionen: Suche vs ersetzen?

s = "a(b" 

Diese beiden arbeiten als

erwartet
s.search("\\(") 
1 

s.replace("\(", "") 
"ab" 

Aber diese nicht

s.search("\(") 
Uncaught SyntaxError: Invalid regular expression: /(/: Unterminated group 

s.replace("\\(", "") 
"a(b" 

Huh? Warum benötigt die Suche eine weitere Escape-Funktion als die Ersetzung?

Auch sollte String-Eingabe keine literale Suche geben, anstatt als Regexp interpretiert werden? Theoretisch sollte ich keine Escape-Zeichen verwenden müssen.

+0

Die Fehlermeldung erklärt alles. 's.search' behandelt das Argument als ein Regex-Muster (also müssen die speziellen Zeichen mit einem umgekehrten Schrägstrich versehen werden), und' s.replace' behandelt die Eingabe als eine Zeichenkette. –

+0

_ "String.prototype.search (regexp): Wenn regexp kein Objekt ist, dessen Eigenschaft [[Class]]" RegExp "ist, wird es durch das Ergebnis des Ausdrucks new RegExp (regexp) ersetzt." _ - http : //www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.pdf – CBroe

Antwort

1

Die Zeichenfolge Literal '\(' ist äquivalent zu '(', so dass Sie wirklich nichts damit entgehen.

String#search interpretiert immer das Argument als regulären Ausdruck; Wenn Sie eine exakte Übereinstimmung finden möchten, verwenden Sie String#indexOf.

> s.indexOf('(') 
1 

s.replace akzeptiert entweder einen String oder einen regulären Ausdruck. Sie geben ihm die Zeichenfolge ( im ersten Fall (so ersetzt er die erste öffnende Klammer, die er sieht) und \( in der zweiten (nicht in der Zeichenfolge, so ersetzt es nichts).

Verwandte Themen