Передача переменной в регулярное выражение в JavaScript
Возможный дубликат:
Escape-строка для использования в регулярных выражениях Javascript
У меня есть сообщение, как это:
Максимум {0} символов разрешено в {1}
И у меня есть функция для создания сообщения с использованием аргументов, переданных как
for(var i = 0; i < agrs.length; i++){
reg = new RegExp('\{'+i+'\}', 'gi');
key = key.replace(reg,agrs[i])
}
Проблема в том, что он не может принять параметр i
создать рег.
Какой способ достичь этого?
4 ответа
Ваше регулярное выражение /{0}/gi
так как вы создаете его из строки. И это не правильное выражение. Вам нужно экранировать {в регулярном выражении, потому что оно имеет особое значение в синтаксисе регулярного выражения, поэтому оно должно быть:
new RegExp('\\{'+i+'\\}', 'gi');
который /\\{0\\}/gi
, Вам нужно сбежать от побега \\
в строке.
Я настоятельно рекомендую вам использовать функциональную форму String.replace() для решения вашей проблемы, а не пытаться параметризовать регулярное выражение в цикле for, который повторяет {0}, {1} и т. Д.
Другими словами, вместо того, чтобы искать "{0}" или "{1}", просто ищите "{([0-9]+)}" (т. Е. {}, Окружающие произвольное число, и передайте функцию в функцию replace () для разумной замены этих выражений на основе числа между {}. Это позволяет вам использовать литерал 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
Смотрите этот похожий вопрос.
изменить: если вы хотите оставить в покое элементы, длина которых превышает длину вашего 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
Я думаю, что ваша вторая строка должна быть
reg = new RegExp('\{'+i+'\}', 'gi');
но я не знаю, это твоя единственная проблема или нет.
function escapeRegExp(str) {
return str.replace(/[-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}
var re = new RegExp(escapeRegExp(str));
Смотрите: Escape-строка для использования в регулярных выражениях Javascript.