Как использовать переменную в регулярном выражении?
Я хочу создать метод <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'
.
Как проверить корректность email-адреса в JavaScript?
Проверка соответствия строки регулярному выражению в JS
Как разделить строку с несколькими разделителями в JavaScript?
Существует ли ссылка на "последнюю" библиотеку jQuery в Google APIs?
Как создать диалог с кнопками "Ок" и "Отмена"