2017-02-03 17 views
-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" 

да? Почему для поиска требуется еще один побег, чем замена?

Кроме того, не следует вводить строковый ввод, чтобы получить литерал, вместо того, чтобы интерпретировать его как регулярное выражение? Теоретически мне не нужно было использовать escape-символы.

+0

Сообщение об ошибке объясняет все. 's.search' рассматривает аргумент как шаблон регулярного выражения (поэтому специальные символы должны быть экранированы с буквальной обратной косой чертой), а' s.replace' обрабатывает ввод как строку. –

+0

_ "String.prototype.search (regexp): Если regexp не является объектом, чье свойство [[Class]] является" RegExp ", оно заменяется результатом выражения нового RegExp (regexp)." _ - http : //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 принимает либо строку или регулярное выражение. Вы даете ему строку ( в первом случае (поэтому она заменяет первую открывающую скобку, которую она видит) и \( во втором (не в строке, поэтому она ничего не заменяет).