2017-02-03 5 views
-2

使用例として、この文字列2つのJavascript関数の間でエスケープ構文が異なるのはなぜですか?search vs replace?

s = "a(b" 

s.search("\\(") 
1 

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

を期待しかし、これらがない

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

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

はぁがそうであるように、これら2つのワーク?検索で置き換えられるよりもエスケープが必要なのはなぜですか?

また、正規表現として解釈される代わりに、文字列入力でリテラル検索を行うべきではありませんか?理論的には、エスケープ文字を使う必要はありません。

+0

エラーメッセージにすべてが説明されています。 's.search'は引数を正規表現パターンとして扱います(特殊文字はリテラルのバックスラッシュでエスケープする必要があります)。' s.replace'は入力を文字列として扱います。 –

+0

_ "String.prototype.search(regexp):regexpが[[Class]]プロパティが" RegExp "のオブジェクトでない場合は、 の式new RegExp(regexp)の結果に置き換えられます。 ://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.pdf – CBroe

答えて

1

文字列リテラル'\(''('に相当するため、実際には何もエスケープしていません。

String#searchは常に引数を正規表現として解釈します。完全一致を検索する場合は、String#indexOfを使用してください。

> s.indexOf('(') 
1 

s.replaceは、文字列または正規表現のいずれかを受け入れます。あなたは最初の場合は(という文字列を与えています(つまり、最初に見えるかっこを置き換えます)。\((文字列ではないので、何も置き換えません)。

関連する問題