Javascript Regex: come inserire una variabile all'interno di un'espressione regolare?


206

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?


11
Tenere presente che se si consente all'utente di fornire questa variabile, è facile per un utente malintenzionato arrestare in modo anomalo l'applicazione tramite un backtracking catastrofico.
Tim Pietzcker,

2
che cos'è "ReGeX"? è un nome variabile? rende confuse le risposte implicando che fa parte della costruzione di RegExp (nel caso in cui un lettore non abbia visto quegli strani personaggi nella domanda).
Eduard,

Risposte:


272
const regex = new RegExp(`ReGeX${testVar}ReGeX`);
...
string.replace(regex, "replacement");

Aggiornare

Per alcuni dei commenti, è importante notare che potresti voler sfuggire alla variabile in caso di potenziale contenuto dannoso (ad es. La variabile proviene dall'input dell'utente)

Aggiornamento ES6

Nel 2019, questo sarebbe di solito scritto usando una stringa di modello e il codice sopra è stato aggiornato. La risposta originale era:

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

5
Assicurati di sfuggire alla tua stringa! Vedi la risposta di @zzzzBov
jtpereyda,

Questo non funziona nel mio caso, puoi per favore dare un'occhiata a questo jsfiddle e farmi sapere se cosa devo fare se voglio impostare una dinamica di prefisso nazionale in regexespressione
Kirankumar Dafda,

10
Una cosa importante da ricordare è che nelle stringhe regolari il carattere \ deve essere sfuggito mentre nel regex letterale (di solito) il carattere / deve essere evaso. Così /\w+\//idiventanew RegExp("\\w+/", "i")
Ali

3
Che ne dici di / g?
Qian Chen

Ragazzi, ho bisogno di dividere questo regex /[^0-9.-[/g in due parti: / [^ 0-9 e -] / g Come si fa?
massimo

79

È possibile utilizzare l'oggetto RegExp:

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

Quindi puoi costruire regexstringnel modo che preferisci.

Puoi leggere di più qui .


var characterCount = parseInt (attrs.limitCharacterCount); console.log (characterCount); var specialCharactersValidation = new RegExp ("/ ^ [a-zA-Z0-9] {" + characterCount + "} $ /"); / \ / ^ [a-zA-Z0-9] {7} $ \ // requestShipmentDirectives.js: 76 false main.js: 46 Uncaught TypeError: Impossibile leggere la proprietà 'offsetWidth' di null Questo è ciò che sta accadendo quando faccio RegEx Dynamic.
Ankit Tanna,

31

Per creare un'espressione regolare da una variabile in JavaScript, dovrai utilizzare il RegExpcostruttore 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);
}

ovviamente, questo è un esempio molto ingenuo. Presuppone che inputsia stato correttamente evaso per un'espressione regolare. Se hai a che fare con l'input dell'utente o vuoi semplicemente rendere più comodo l'abbinamento di caratteri speciali, dovrai scappare da 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);
}

L'unico modo in cui ha funzionato per me è stato se ho eliminato il ReGeXtesto. Quindi ho usato:return new RegExp(input, flags);
Michael Rader il

2
@MichaelRader, sì, il testo "ReGeX" faceva parte della domanda e veniva usato come esempio, non come qualcosa necessario per far funzionare il codice.
zzzzBov

1
Ho appena capito che era solo il tuo segnaposto, ma da noob mi ci è voluto un po 'per capire. Grazie.
Michael Rader,

Capisco perché la stringa deve essere sfuggita. Ma perché '\\ $ &' ​​è usato in sostituzione
Sherin Binu,

2
\\rappresenta un singolo \carattere, $&è la sottostringa abbinata .
zzzzBov,

7

se stai usando i template letterali es6 sono un'opzione ...

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

non funziona con i template letterali. Sto usando regexp per convalidare la password nella mia app e volevo parametrizzare la lunghezza massima e minima nella mia stringa di espressioni regolari e non funziona. `` `const newRegExp = new RegExp ( ^[^\s]{${4},${32}}$); export const validatePassword = value => value.match (newRegExp); ``
p7adams,

6

Puoi sempre dare un'espressione regolare come stringa, ad es "ReGeX" + testVar + "ReGeX" . Probabilmente dovrai sfuggire ad alcuni caratteri all'interno della tua stringa (ad esempio, virgolette doppie), ma nella maggior parte dei casi è equivalente.

Puoi anche usare la funzione di RegExpcostruzione per passare i flag ( vedi i documenti ).


3

Puoi creare espressioni regolari in JS in due modi:

  1. Usando l'espressione regolare letterale - /ab{2}/g
  2. Utilizzando il costruttore di espressioni regolari - new RegExp("ab{2}", "g").

I letterali delle espressioni regolari sono costanti e non possono essere utilizzati con le variabili. Ciò potrebbe essere ottenuto utilizzando il costruttore. La struttura del costruttore RegEx è

new RegExp(regularExpressionString, modifiersString)

È possibile incorporare variabili come parte di regularExpressionString. Per esempio,

var pattern="cd"
var repeats=3
new RegExp(`${pattern}{${repeats}}`, "g") 

Ciò corrisponderà a qualsiasi aspetto del motivo cdcdcd.


2

Ecco una funzione piuttosto inutile che restituisce valori racchiusi 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)

2

la risposta accettata non funziona per me e non segue esempi di MDN

vedere la sezione "Descrizione" nel link sopra

Vorrei andare con il seguente funziona per me:

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

// that makes dynamicRegExp = /findMe/gi

1
Funziona ancora. Il problema è che 'ReGeX' + testVar + 'ReGeX' rende la soluzione confusa. Aggiungere un esempio in realtà chiarirebbe le cose secondo me. var testVar = '321'; var regex = new RegExp ("[" + testVar + "] {2}", "g"); // sopra equivalente a / [321] {2} / g
HelloWorldPeace il

1

È solo necessario preparare prima la variabile stringa e poi convertirla in RegEx.

per esempio:

Si desidera aggiungere minLengthe MaxLengthcon la variabile a RegEx:

function getRegEx() {
    const minLength = "5"; // for exapmle: min is 5
    const maxLength = "12"; // for exapmle: man is 12

    var regEx = "^.{" + minLength + ","+ maxLength +"}$"; // first we make a String variable of our RegEx
    regEx = new RegExp(regEx, "g"); // now we convert it to RegEx

    return regEx; // In the end, we return the RegEx
}

ora se cambi il valore di MaxLengtho MinLength, cambierà in tutti i RegEx.

Spero di essere utile. Mi dispiace anche per il mio inglese.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.