Javascript Regex: come inserire una variabile in un’espressione regolare?

Quindi per esempio:

function(input){ var testVar = input; string = ... string.replace(/ReGeX + testVar + ReGeX/, "replacement") } 

Ma questo ovviamente non funziona 🙂 C’è un modo per farlo?

 var regex = new RegExp("ReGeX" + testVar + "ReGeX"); ... string.replace(regex, "replacement"); 

Aggiornare

Per alcuni commenti, è importante notare che è ansible che si desideri sfuggire alla variabile se esiste un potenziale di contenuto dannoso (ad esempio la variabile proviene da input dell’utente)

È ansible utilizzare l’object RegExp:

 var regexstring = "whatever"; var regexp = new RegExp(regexstring, "gi"); var str = "whateverTest"; var str2 = str.replace(regexp, "other"); document.write(str2); 

Quindi puoi build regexstring nel modo che preferisci.

Puoi leggere di più qui .

Per creare un’espressione regolare da una variabile in JavaScript, è necessario utilizzare il costruttore RegExp con un parametro stringa.

 function reg(input) { var flags; //could be any combination of 'g', 'i', and 'm' flags = 'g'; return new RegExp('ReGeX' + input + 'ReGeX', flags); } 

certo, questo è un esempio molto ingenuo. Presume che l’ input sia stato correttamente scappato per un’espressione regolare. Se hai a che fare con l’input dell’utente, o semplicemente vuoi rendere più conveniente abbinare caratteri speciali, dovrai sfuggire ai caratteri speciali :

 function regexEscape(str) { return str.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') } function reg(input) { var flags; //could be any combination of 'g', 'i', and 'm' flags = 'g'; input = regexEscape(input); return new RegExp('ReGeX' + input + 'ReGeX', flags); } 

Puoi sempre dare espressioni regolari come stringhe, ovvero "ReGeX" + testVar + "ReGeX" . Probabilmente dovrai sfuggire alcuni caratteri all’interno della stringa (ad esempio, virgolette doppie), ma per la maggior parte dei casi è equivalente.

Puoi anche utilizzare il costruttore RegExp per passare i flag in ( vedi i documenti ).

se stai usando i template letterali es6 sono un’opzione …

 string.replace(new RegExp(`ReGeX${testVar}ReGeX`), "replacement") 

risposta accettata non funziona per me e non segue gli esempi MDN

vedi la sezione ‘Descrizione’ nel link sopra

Vorrei andare con il seguente che funziona per me:

 let stringThatIsGoingToChange = 'findMe'; let flagsYouWant = 'gi' //simple string with flags let dynamicRegExp = new RegExp(`${stringThatIsGoingToChange}`, 'flagsYouWant') // that makes dynamicRegExp = /findMe/gi 

Ecco una funzione piuttosto inutile che restituisce valori avvolti da caratteri specifici. 🙂

jsfiddle: https://jsfiddle.net/squadjot/43agwo6x/

 function getValsWrappedIn(str,c1,c2){ var rg = new RegExp("(?<=\\"+c1+")(.*?)(?=\\"+c2+")","g"); return str.match(rg); } var exampleStr = "Something (5) or some time (19) or maybe a (thingy)"; var results = getValsWrappedIn(exampleStr,"(",")") // Will return array ["5","19","thingy"] console.log(results)