Передача переменной в regexp в javascript

Возможный дубликат:
Строка Escape для использования в Javascript regex

У меня есть msg, как это:

Максимальные {0} символы разрешены в {1}

И у меня есть функция для создания сообщения с использованием аргументов, переданных как

for(var i = 0; i < agrs.length; i++){
    reg = new RegExp('\{'+i+'\}', 'gi');
    key = key.replace(reg,agrs[i])
}

Проблема заключается в том, что он не может принять param i для создания reg exp.

Каким образом достичь этого?

Ответы

Ответ 1

Ваше регулярное выражение /{0}/gi, поскольку вы создаете его из строки. И это не допустимое выражение. Вам нужно избежать {в регулярном выражении, потому что оно имеет особое значение в синтаксисе regexp, поэтому оно должно быть:

new RegExp('\\{'+i+'\\}', 'gi');

который равен /\\{0\\}/gi. Вам нужно избежать escape-строки \\ в строке.

Ответ 2

Я бы настоятельно рекомендовал вам использовать функциональную форму String.replace(), чтобы решить вашу проблему, вместо того, чтобы пытаться параметризовать regexp в цикле for, который выполняет итерацию по {0}, {1} и т.д.

Другими словами, вместо поиска '{0}' или '{1}', просто найдите '{([0-9] +)}' (т.е. {}, окружающий произвольное число, и передайте функцию для функции replace(), чтобы разумно заменить эти выражения на основе числа между {} 's. Это позволяет использовать литерал RegExp, который вы можете написать как /{([0-9] +)}/, а не беспорядок вокруг с escape-символами в строках.

Что-то вроде этого:

s='the song says {0} little {1} little {2} little-endians';
args=['zero','one','two'];
new_string = s.replace(/{([0-9]+)}/g, function(wholematch,firstmatch)
  {return args[(+firstmatch)]; }
);

что дает

the song says zero little one little two little-endians

См. этот аналогичный вопрос.

edit: если вы хотите оставить только те элементы, которые больше длины вашего списка args, обязательно проверьте работоспособность номера параметра:

s='the song says {0} little {1} little {2} little-endians,\n'+
  ' {3} little {4} little {5} little-endians';
args=['zero','one','two'];
new_string = s.replace(/{([0-9]+)}/g, function(wholematch,firstmatch)
  {var i = +firstmatch; return i < args.length ? args[i] : wholematch;}
);

что дает

the song says zero little one little two little-endians,
 {3} little {4} little {5} little-endians

Ответ 3

Я думаю, что ваша вторая строка должна быть

reg = new RegExp('\{'+i+'\}', 'gi');

но я не знаю, является ли это вашей единственной проблемой или нет.