Come si usa una variabile in un’espressione regolare?

Vorrei creare un metodo String.replaceAll () in JavaScript e sto pensando che usare un RegEx sarebbe il modo più semplice per farlo. Tuttavia, non riesco a capire come passare una variabile in una RegEx. Posso farlo già che sostituirà tutte le istanze di “B” con “A”.

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

Ma voglio fare qualcosa del genere:

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

Ma ovviamente questo sostituirà solo il testo “replaceThis” … quindi come faccio a passare questa variabile nella mia stringa RegEx?

Invece di usare la syntax /regex/g , puoi build un nuovo object RegExp :

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

In questo modo puoi creare dynamicmente oggetti regex. Quindi farai:

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

Come ha detto Eric Wendelin, puoi fare qualcosa del genere:

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

Questo produce "regex matching ." . Tuttavia, fallirà se str1 è "." . Ci si aspetterebbe che il risultato fosse "pattern matching regex" , sostituendo il periodo con "regex" , ma risulterebbe essere …

 regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex 

Questo perché, sebbene "." è una stringa, nel costruttore RegExp è ancora interpretata come un’espressione regolare, ovvero qualsiasi carattere non di interruzione di riga, ovvero ogni carattere nella stringa. A tale scopo, può essere utile la seguente funzione:

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

Quindi puoi fare:

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

producendo "pattern matching regex" .

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

Come sempre: non usare regex a meno che non sia necessario. Per una semplice sostituzione di stringa, l’idioma è:

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

Quindi non devi preoccuparti dei problemi citati menzionati nella risposta di Gracenotes.

Per tutti coloro che cercano di utilizzare variabili con il metodo di corrispondenza , questo ha funzionato per me

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

Questo:

 var txt=new RegExp(pattern,attributes); 

è equivalente a questo:

 var txt=/pattern/attributes; 

Vedi 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"); 

Prova con questo strumento

Si desidera creare l’espressione regolare in modo dinamico e per questo la soluzione corretta è utilizzare il new RegExp(string) costruttore new RegExp(string) . Affinché il costruttore possa interpretare letteralmente i caratteri speciali, è necessario sfuggirli. Esiste una funzione integrata nel widget di completamento automatico dell’interfaccia utente jQuery denominata $.ui.autocomplete.escapeRegex :

[…] puoi utilizzare la funzione $.ui.autocomplete.escapeRegex integrata. Prenderà un singolo argomento di stringa e sfugge a tutti i caratteri di new RegExp() , rendendo il risultato sicuro passare al new RegExp() .

Se si utilizza l’interfaccia utente di jQuery, è ansible utilizzare tale funzione o copiarne la definizione dall’origine :

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

E usalo in questo modo:

 "[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 si desidera ottenere TUTTE le occorrenze ( g ), fare distinzione tra maiuscole e minuscole ( i ) e utilizzare i limiti in modo che non si tratti di una parola all’interno di un’altra parola ( \\b ):

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

Esempio:

 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. 

Mentre puoi creare RegExp creato dynamicmente (come per le altre risposte a questa domanda), echo il mio commento da un post simile : La forma funzionale di String.replace () è estremamente utile e in molti casi riduce la necessità di oggetti RegExp creati dynamicmente. (che sono una specie di problema perché devi esprimere l’input al costruttore RegExp come una stringa piuttosto che usare le barre / formato alfabetico [AZ] + / regexp)

Ecco un’altra implementazione 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; }; 

Per soddisfare il mio bisogno di inserire una variabile / alias / funzione in un’espressione regolare, questo è ciò che mi è venuto in mente:

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

dove ‘oldre’ è la regexp originale che voglio inserire una variabile, ‘xx’ è il segnaposto per quella variabile / alias / funzione, e ‘yy’ è il nome della variabile attuale, l’alias o la funzione.

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

Provalo come:

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

E la versione coffeescript della risposta di Steven Penny, dato che questo è il risultato di # 2 su google …. anche se il caffè è solo javascript con molti personaggi rimossi …;)

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

e nel mio caso particolare

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

Puoi usare questo se $ 1 non funziona con te

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

Puoi sempre usare indexOf ripetutamente:

 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); }; 

Questo non entra in un ciclo infinito quando la sostituzione contiene la corrispondenza.

La tua soluzione è qui:

Passa una variabile all’espressione regolare.

Quello che ho implementato è prendendo il valore da un campo di testo che è quello che vuoi sostituire e un altro è il campo di testo “sostituisci con”, ottenendo il valore dal campo di testo in una variabile e impostando la variabile su RegExp funzione di ulteriore sostituzione. Nel mio caso sto usando Jquery, puoi farlo anche solo con JavaScript.

Codice 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)); }); 

Questo codice è su evento Onclick di un pulsante, puoi metterlo in una funzione da chiamare.

Così ora puoi passare una variabile in funzione di sostituzione.