#javascript #regex
#javascript #регулярное выражение
Вопрос:
Мне нужно поместить переменную в регулярное выражение, но строка не заменяется, как первая переменная data1
var data1 = "value=first_name=Johnamp;last_name=Doe;"
.replace(/(value=).*(;)/g, '$1first_name=Homeramp;last_name=Simspon$2');
console.log(data1);
var key = 'value';
var data2 = "value=first_name=Johnamp;last_name=Doe;"
.replace(new RegExp(`/(${key}=).*(;)/`, 'g'), '1$first_name=Fooamp;last_name=Bar2$');
console.log(data2);
data2 should output: value=first_name=Fooamp;last_name=Bar
Ответ №1:
Совсем близко! Нет необходимости в /
s при использовании new RegExp()
, и это $1
и $2
не 1$
и 2$
:
var key = 'value';
var data2 = "value=first_name=Johnamp;last_name=Doe;"
.replace(new RegExp(`(${key}\=).*(;)`, 'g'), '$1first_name=Fooamp;last_name=Bar$2');
ДЕМОНСТРАЦИЯ
var data1 = "value=first_name=Johnamp;last_name=Doe;"
.replace(/(value=).*(;)/g, '$1first_name=Homeramp;last_name=Simspon$2');
console.log(data1);
var key = 'value';
var data2 = "value=first_name=Johnamp;last_name=Doe;"
.replace(new RegExp(`(${key}=).*(;)`, 'g'), '$1first_name=Fooamp;last_name=Bar$2');
console.log(data2);
data2 should output: value=first_name=Fooamp;last_name=Bar
Ответ №2:
Косые черты являются разделителями для литералов регулярных выражений. Если вы используете new RegExp
, используемые разделители являются разделителями для строки, которую вы в нее передаете (если у вас вообще есть такой строковый литерал).
Следующее регулярное выражение:
const regex = new RegExp('/foo/');
эквивалентно:
const regex = //foo//;
Сопоставляется буквенная косая черта. Итак, с помощью конструктора регулярных выражений вам нужно удалить косые черты:
var key = 'value';
var data2 = "value=first_name=Johnamp;last_name=Doe;"
.replace(new RegExp(`(${key}=).*(;)`, 'g'), '$1first_name=Fooamp;last_name=Bar$2');
console.log(data2);
data2 should output: value=first_name=Fooamp;last_name=Bar
Обратите внимание, что вы должны использовать $1
и $2
, а не 1$
и 2$
.
Вы можете сделать его немного более элегантным с помощью
- не экранирование
=
(это не специальный символ) - не захватывая
;
, просто сопоставьте его обычным образом (и замените на;
в конце вместо$2
)
var key = 'value';
var data2 = "value=first_name=Johnamp;last_name=Doe;"
.replace(new RegExp(`(${key}=).*;`, 'g'), '$1first_name=Fooamp;last_name=Bar;');
console.log(data2);
data2 should output: value=first_name=Fooamp;last_name=Bar