регулярное выражение с переменной не заменяет текст, как это делает обычное выражение

#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