Как использовать переменную в регулярном выражении?
Я хочу создать метод <code>String.replaceAll()</code> в JavaScript и считаю, что использование регулярных выражений будет наиболее лаконичным способом сделать это. Однако я не могу понять, как передать переменную в регулярное выражение. У меня уже есть работающий пример, который заменяет все вхождения <code>"B"</code> на <code>"A"</code>:
"ABABAB".replace(/B/g, "A");
Но я хочу сделать что-то вроде этого:
String.prototype.replaceAll = function(replaceThis, withThis) {
this.replace(/replaceThis/g, withThis);
};
Но, очевидно, это только заменит текст <code>"replaceThis"</code>... как же мне передать эту переменную в регулярное выражение?
4 ответ(ов)
Как упомянул Эрик Уэндлин, вы можете сделать что-то вроде этого:
str1 = "pattern";
var re = new RegExp(str1, "g");
"pattern matching .".replace(re, "regex");
Это даст результат "regex matching .". Однако, если str1 будет равен ".", вы ожидаете получить "pattern matching regex", заменив точку на "regex", но на самом деле получится...
regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex
Это происходит потому, что, хоть "." и является строкой, в конструкторе RegExp оно всё равно интерпретируется как регулярное выражение, что означает любую непереходящую строку, то есть любой символ. Для этой цели может быть полезна следующая функция:
RegExp.quote = function(str) {
return str.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
};
Тогда вы можете сделать так:
str1 = ".";
var re = new RegExp(RegExp.quote(str1), "g");
"pattern matching .".replace(re, "regex");
В итоге у вас будет "pattern matching regex".
Как и всегда: не используйте регулярные выражения, если это не необходимо. Для простого замещения строк лучше использовать следующий подход:
'ABABAB'.split('B').join('A');
Таким образом, вам не придется беспокоиться о проблемах с кавычками, упомянутых в ответе Gracenotes.
Это:
var txt = new RegExp(pattern, attributes);
эквивалентно этому:
var txt = /pattern/attributes;
Для дополнительной информации, вы можете ознакомиться с документацией на W3Schools.
Если вы ищете способ использовать переменную с методом match, вот что сработало для меня:
var alpha = 'fig';
'food fight'.match(alpha + 'ht')[0]; // fight
В данном примере переменная alpha содержит строку 'fig'. Метод match использует регулярное выражение, образованное из переменной alpha и добавленной к ней строки 'ht'. В результате мы получаем первый элемент массива совпадений, который в данном случае равен 'fight'.
Как разделить строку с несколькими разделителями в JavaScript?
Экранирование строки для использования в регулярных выражениях JavaScript [duplicate]
Как удалить все переносы строк из строки
Удаление всего, кроме чисел, из строки
JavaScript Regexp - Найти символы после определённой фразы