19

Как использовать переменную в регулярном выражении?

12

Я хочу создать метод <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 ответ(ов)

2

Как упомянул Эрик Уэндлин, вы можете сделать что-то вроде этого:

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".

1

Как и всегда: не используйте регулярные выражения, если это не необходимо. Для простого замещения строк лучше использовать следующий подход:

'ABABAB'.split('B').join('A');

Таким образом, вам не придется беспокоиться о проблемах с кавычками, упомянутых в ответе Gracenotes.

0

Это:

var txt = new RegExp(pattern, attributes);

эквивалентно этому:

var txt = /pattern/attributes;

Для дополнительной информации, вы можете ознакомиться с документацией на W3Schools.

0

Если вы ищете способ использовать переменную с методом match, вот что сработало для меня:

var alpha = 'fig';
'food fight'.match(alpha + 'ht')[0]; // fight

В данном примере переменная alpha содержит строку 'fig'. Метод match использует регулярное выражение, образованное из переменной alpha и добавленной к ней строки 'ht'. В результате мы получаем первый элемент массива совпадений, который в данном случае равен 'fight'.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь