Передача переменной в 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');
но я не знаю, является ли это вашей единственной проблемой или нет.
Ответ 4
function escapeRegExp(str) {
return str.replace(/[-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}
var re = new RegExp(escapeRegExp(str));
Смотрите: строка Escape для использования в Javascript regex