Como você usa uma variável em uma expressão regular?

Eu gostaria de criar um método String.replaceAll () em JavaScript e estou pensando que usar um RegEx seria a maneira mais concisa de fazê-lo. No entanto, não consigo descobrir como passar uma variável para um RegEx. Eu posso fazer isso já que irá replace todas as instâncias de “B” com “A”.

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

Mas eu quero fazer algo assim:

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

Mas obviamente isso só irá replace o texto “replaceThis” … então como eu passo essa variável para minha string RegEx?

Em vez de usar a syntax /regex/g , você pode construir um novo object RegExp :

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

Você pode criar dinamicamente objects regex dessa maneira. Então você vai fazer:

 "mystring".replace(re, "newstring"); 

Como Eric Wendelin mencionou, você pode fazer algo assim:

 str1 = "pattern" var re = new RegExp(str1, "g"); "pattern matching .".replace(re, "regex"); 

Isso produz "regex matching ." . No entanto, ele falhará se str1 for "." . Você esperaria que o resultado fosse "pattern matching regex" , substituindo o período por "regex" , mas acabará sendo …

 regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex 

Isso ocorre porque, embora "." é uma String, no construtor RegExp ela ainda é interpretada como uma expressão regular, significando qualquer caractere que não seja quebra de linha, significando cada caractere na string. Para este propósito, a seguinte function pode ser útil:

  RegExp.quote = function(str) { return str.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"); }; 

Então você pode fazer:

 str1 = "." var re = new RegExp(RegExp.quote(str1), "g"); "pattern matching .".replace(re, "regex"); 

produzindo "pattern matching regex" .

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

Como sempre: não use o regex, a menos que seja necessário. Para uma substituição de cadeia simples, a expressão idiomática é:

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

Então você não precisa se preocupar com as questões citadas na resposta de Gracenotes.

Para quem quer usar variável com o método de correspondência , isso funcionou para mim

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

Este:

 var txt=new RegExp(pattern,attributes); 

é equivalente a isso:

 var txt=/pattern/attributes; 

Veja http://www.w3schools.com/jsref/jsref_obj_regexp.asp .

 this.replace( new RegExp( replaceThis, 'g' ), withThis ); 
 String.prototype.replaceAll = function (replaceThis, withThis) { var re = new RegExp(replaceThis,"g"); return this.replace(re, withThis); }; var aa = "abab54..aba".replaceAll("\\.", "v"); 

Teste com esta ferramenta

Você quer construir a expressão regular dinamicamente e para isso a solução adequada é usar o new RegExp(string) construtor new RegExp(string) . Para que o construtor trate caracteres especiais literalmente , você deve escaping deles. Há uma function incorporada no widget de preenchimento automático da jQuery UI chamado $.ui.autocomplete.escapeRegex :

[…] você pode fazer uso da function $.ui.autocomplete.escapeRegex . Será necessário um único argumento de string e escape de todos os caracteres de expressão regular, tornando o resultado seguro para passar para o new RegExp() .

Se você estiver usando o jQuery UI, poderá usar essa function ou copiar sua definição da origem :

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

E usá-lo assim:

 "[za][za][za]".replace(new RegExp(escapeRegex("[za]"), "g"), "[az]"); // escapeRegex("[za]") -> "\[z\-a\]" // new RegExp(escapeRegex("[za]"), "g") -> /\[z\-a\]/g // end result -> "[az][az][az]" 

Se você deseja obter TODAS as ocorrências ( g ), não diferencia maiúsculas de minúsculas ( i ) e use limites para que não seja uma palavra dentro de outra palavra ( \\b ):

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

Exemplo:

 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. 

Embora você possa criar RegExps criados dinamicamente (de acordo com as outras respostas a essa pergunta), vou repetir meu comentário de uma postagem semelhante : A forma funcional de String.replace () é extremamente útil e, em muitos casos, reduz a necessidade de objects RegExp criados dinamicamente. (que são uma espécie de dor, porque você tem que expressar a input para o construtor RegExp como uma string em vez de usar as barras / [AZ] + / literal formato regexp)

Aqui está outra implementação replaceAll:

  String.prototype.replaceAll = function (stringToFind, stringToReplace) { if ( stringToFind == stringToReplace) return this; var temp = this; var index = temp.indexOf(stringToFind); while (index != -1) { temp = temp.replace(stringToFind, stringToReplace); index = temp.indexOf(stringToFind); } return temp; }; 

Para satisfazer minha necessidade de inserir uma variável / alias / function em uma expressão regular, foi isso que eu criei:

 oldre = /xx\(""\)/; function newre(e){ return RegExp(e.toString().replace(/\//g,"").replace(/xx/g, yy), "g") }; String.prototype.replaceAll = this.replace(newre(oldre), "withThis"); 

onde ‘oldre’ é o regexp original que eu quero inserir uma variável, ‘xx’ é o espaço reservado para essa variável / alias / function, e ‘yy’ é o nome da variável real, alias ou function.

 String.prototype.replaceAll = function(a, b) { return this.replace(new RegExp(a.replace(/([.?*+^$[\]\\(){}|-])/ig, "\\$1"), 'ig'), b) } 

Teste como:

 var whatever = 'Some [b]random[/b] text in a [b]sentence.[/b]' console.log(whatever.replaceAll("[", "<").replaceAll("]", ">")) 

E a versão do café da resposta de Steven Penny, uma vez que este é o resultado do google # 2 …. mesmo se o café é apenas javascript com um monte de caracteres removidos …;)

 baz = "foo" filter = new RegExp(baz + "d") "food fight".match(filter)[0] // food 

e no meu caso particular

 robot.name=hubot filter = new RegExp(robot.name) if msg.match.input.match(filter) console.log "True!" 

Você pode usar isso se $ 1 não funcionar com você

 var pattern = new RegExp("amman","i"); "abc Amman efg".replace(pattern,""+"abc Amman efg".match(pattern)[0]+""); 

Você sempre pode usar indexOf repetidamente:

 String.prototype.replaceAll = function(substring, replacement) { var result = ''; var lastIndex = 0; while(true) { var index = this.indexOf(substring, lastIndex); if(index === -1) break; result += this.substring(lastIndex, index) + replacement; lastIndex = index + substring.length; } return result + this.substring(lastIndex); }; 

Isso não entra em um loop infinito quando a substituição contém a correspondência.

Sua solução está aqui:

Passar uma variável para expressão regular.

O que eu tenho implementado é tomando o valor de um campo de texto que é o que você deseja replace e outro é o campo de texto “replace com”, obtendo o valor do campo de texto em uma variável e definindo a variável para RegExp function para replace ainda mais. No meu caso eu estou usando o Jquery, você também pode fazer isso apenas por JavaScript também.

Código JavaScript:

  var replace =document.getElementById("replace}"); // getting a value from a text field with I want to replace var replace_with = document.getElementById("with"); //Getting the value from another text fields with which I want to replace another string. var sRegExInput = new RegExp(replace, "g"); $("body").children().each(function() { $(this).html($(this).html().replace(sRegExInput,replace_with)); }); 

Este código está no evento Onclick de um botão, você pode colocar isso em uma function para chamar.

Então agora você pode passar variável na function de substituição.