регулярное выражение javascript и дополнительные символы в результате

#javascript #regex #string #replace #escaping

#javascript #регулярное выражение #строка #заменить #экранирование

Вопрос:

Я хочу найти в строке подстроки и заменить их все. Подстроки содержат несколько специальных символов ($). Я использую регулярные выражения и получаю некоторые (для меня) неожиданные результаты.

Пожалуйста, скажите мне, в чем моя ошибка.

 RegExp.escape = function(value) {
     return value.replace(/[-[]{}()* ?.,\^$|#s]/g, "\$amp;");
}

var str         = "[block $$text$$] ===";
var substr_old  = "[block $$text$$]";
var substr_new  = "[xxxxx $$text$$]";

console.log(str);

str = str.replace(RegExp(RegExp.escape(substr_old), 'g'), substr_new);

console.log(str);
  

Результаты:

 before: [block $$text$$] ===
after:  [xxxxx $text$] ===
  

Почему были $?

Я ожидаю следующего результата:

 before: [block $$text$$] ===
after:  [xxxxx $$text$$] ===
  

Ответ №1:

Потому что вам нужно использовать $$ в шаблоне замены для замены на один $ .

Использовать

 str = str.replace(RegExp(RegExp.escape(substr_old), 'g'), substr_new.replace(/$/g, '$$$$'));
  

ДЕМОНСТРАЦИЯ:

 RegExp.escape = function(value) {
     return value.replace(/[-[]{}()* ?.,\^$|#s]/g, "\$amp;");
}

var str         = "[block $$text$$] ===";
var substr_old  = "[block $$text$$]";
var substr_new  = "[xxxxx $$text$$]";

console.log(str);

str = str.replace(RegExp(RegExp.escape(substr_old), 'g'), substr_new.replace(/$/g, "$$$$"));

console.log(str);  

Комментарии:

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

2. Только $ . Это называется экранированием доллара, это единственное предостережение.