#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. Только
$
. Это называется экранированием доллара, это единственное предостережение.