2014-10-05 4 views
0

Я хочу превратить строку dkfj-dkfj-sflj в dkfj-woop$dkfj-sflj.

Вот что я пробовал:

var my_string = "dkfj-dkfj-sflj"; 
var regex = new RegExp("(\\w+)-(\\w+)-(\\w+)", "g"); 
console.log(my_string.replace(regex, "$1$woop[\$$2]$3"); 

И мой результат: dkfj-woop$2-sflj. Поскольку «$» находится перед группой захвата «$ 2», она помешает этой группе захвата.

Предполагаете, что я хочу, чтобы структура моего регулярного выражения и группы группы захвата оставалась неизменной, каков правильный способ избежать этого «$», поэтому он работает?

ответ

3

Это не то, как вы избегаете $ для replace. Работа с обратным слэшем работает на уровне анализатора, такие функции, как replace, не могут придавать особое значение новым escape-последовательностям, например \$, потому что они даже не см.\$. Строка "\$" в точности эквивалентна строке "$", обе производят одну и ту же строку. Если вы хотите передать обратную косую черту и знак доллара в функцию, это обратная косая черта, которая требует экранирования: "\\$".

Независимо от того, replace ожидает, что вы избежите $ с $$. Вам нужно "$1$woop[$$$2]$3"; a $$ для буквального $ и $2 для группы захвата.

Прочитано Specifying a string as a parameter в статьях replace.

1

Используйте $$ в заменяемой части, чтобы напечатать букву $, и вам не нужно иметь класс символов в заменяемой части, если ваш шаблон был заключен в косые черты.

> var my_string = "dkfj-dkfj-sflj"; 
undefined 
> my_string.replace(/(\w+)-\w+-(\w+)/, "$1-woop$$$1-$2") 
'dkfj-woop$dkfj-sflj' 
Смежные вопросы