Как вы используете переменную в регулярном выражении? - PullRequest
1150 голосов
/ 30 января 2009

Я хотел бы создать метод String.replaceAll() в JavaScript, и я думаю, что использование регулярного выражения было бы наиболее кратким способом сделать это. Однако я не могу понять, как передать переменную в регулярное выражение. Я могу сделать это уже, что заменит все экземпляры "B" на "A".

"ABABAB".replace(/B/g, "A");

Но я хочу сделать что-то вроде этого:

String.prototype.replaceAll = function(replaceThis, withThis) {
    this.replace(/replaceThis/g, withThis);
};

Но очевидно, что это заменит только текст "replaceThis" ... так как мне передать эту переменную в мою строку регулярного выражения?

Ответы [ 18 ]

1598 голосов
/ 30 января 2009

Вместо использования синтаксиса /regex/g вы можете создать новый объект RegExp :

var replace = "regex";
var re = new RegExp(replace,"g");

Таким способом вы можете динамически создавать объекты регулярных выражений. Тогда вы будете делать:

"mystring".replace(re, "newstring");
186 голосов
/ 30 января 2009

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

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

100 голосов
/ 01 февраля 2009

"ABABAB".replace(/B/g, "A");

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

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

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

32 голосов
/ 28 ноября 2012

Для тех, кто хочет использовать переменную с методом match , это сработало для меня

var alpha = 'fig';
'food fight'.match(alpha + 'ht')[0]; // fight
27 голосов
/ 30 января 2009

Это:

var txt=new RegExp(pattern,attributes);

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

var txt=/pattern/attributes;

См. http://www.w3schools.com/jsref/jsref_obj_regexp.asp.

18 голосов
/ 13 июня 2018

Если вы хотите получить ВСЕ вхождения (g), учитывайте регистр (i) и используйте границы, чтобы это не было словом в другом слове (\\b):

re = new RegExp(`\\b${replaceThis}\\b`, 'gi');

Пример:

let inputString = "I'm John, or johnny, but I prefer john.";
let replaceThis = "John";
let re = new RegExp(`\\b${replaceThis}\\b`, 'gi');
console.log(inputString.replace(re, "Jack")); // I'm Jack, or johnny, but I prefer Jack.
18 голосов
/ 30 января 2009
this.replace( new RegExp( replaceThis, 'g' ), withThis );
9 голосов
/ 14 сентября 2014

Вы хотите построить регулярное выражение динамически, и для этого правильным решением является использование конструктора new RegExp(string). Чтобы конструктор мог обрабатывать специальные символы буквально , вы должны их избежать. В виджете автозаполнения пользовательского интерфейса jQuery есть встроенная функция с именем $.ui.autocomplete.escapeRegex:

[...] вы можете использовать встроенный $.ui.autocomplete.escapeRegex функция. Это займет одну строку аргумент и экранировать все символы регулярного выражения, делая результат безопасным для перейти к new RegExp().

Если вы используете пользовательский интерфейс jQuery, вы можете использовать эту функцию или скопировать ее определение из источника :

function escapeRegex(value) {
    return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
}

И используйте это так:

"[z-a][z-a][z-a]".replace(new RegExp(escapeRegex("[z-a]"), "g"), "[a-z]");
//            escapeRegex("[z-a]")       -> "\[z\-a\]"
// new RegExp(escapeRegex("[z-a]"), "g") -> /\[z\-a\]/g
// end result                            -> "[a-z][a-z][a-z]"
9 голосов
/ 01 февраля 2009
String.prototype.replaceAll = function (replaceThis, withThis) {
   var re = new RegExp(replaceThis,"g"); 
   return this.replace(re, withThis);
};
var aa = "abab54..aba".replaceAll("\\.", "v");

Тест с этим инструментом

5 голосов
/ 20 августа 2013
String.prototype.replaceAll = function(a, b) {
    return this.replace(new RegExp(a.replace(/([.?*+^$[\]\\(){}|-])/ig, "\\$1"), 'ig'), b)
}

Проверьте это как:

var whatever = 'Some [b]random[/b] text in a [b]sentence.[/b]'

console.log(whatever.replaceAll("[", "<").replaceAll("]", ">"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...