web-dev-qa-db-fra.com

Javascript Regex: Comment mettre une variable dans une expression régulière?

Donc par exemple:

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

Mais cela ne fonctionne bien entendu pas:).

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

Mettre à jour

Pour certains des commentaires, il est important de noter que vous pouvez souhaiter échapper la variable s'il existe un potentiel de contenu malveillant (par exemple, la variable provient d'une entrée utilisateur)

216
Jason McCreary

Vous pouvez utiliser l'objet RegExp:

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

Ensuite, vous pouvez construire regexstring comme bon vous semble. 

Vous pouvez en lire plus à ce sujet ici .

69
steinar

Pour créer une expression régulière à partir d'une variable en JavaScript, vous devez utiliser le constructeur RegExp avec un paramètre de chaîne.

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

bien sûr, ceci est un exemple très naïf. Il suppose que input a été correctement échappé pour une expression régulière. Si vous avez affaire à une saisie utilisateur ou si vous souhaitez simplement faciliter la correspondance des caractères spéciaux, vous devez échapper aux caractères spéciaux :

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

Vous pouvez toujours donner une expression régulière sous forme de chaîne, c'est-à-dire "ReGeX" + testVar + "ReGeX". Vous devrez éventuellement échapper des caractères dans votre chaîne (par exemple, une citation double), mais dans la plupart des cas, cela équivaut à.

Vous pouvez également utiliser le constructeur RegExp pour passer des indicateurs ( voir la documentation ).

6
Nikita Rybak

si vous utilisez es6 template literals are a option ...

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

réponse acceptée ne fonctionne pas pour moi et ne suit pas exemples MDN

voir la section 'Description' dans le lien ci-dessus

J'irais avec ce qui suit ça marche pour moi:

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

// that makes dynamicRegExp = /findMe/gi
2
Timothy Mitchell

Il suffit de préparer d'abord la variable chaîne, puis de la convertir en RegEx.

par exemple:

Vous voulez ajouter minLength et MaxLength avec la variable à 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
}

maintenant si vous changez la valeur de MaxLength ou MinLength, cela changera dans tous les RegEx.

J'espère être utile. Aussi désolé pour mon anglais.

1
Abbas Habibnejad

Voici une fonction assez inutile qui retourne des valeurs enveloppées par des caractères spécifiques. :)

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)
1
Jakob Sternberg

Vous pouvez créer des expressions régulières dans JS de deux manières: 

  1. Utilisation d'expressions régulières littérales - /ab{2}/g
  2. Utilisation du constructeur d’expression régulière - new RegExp("ab{2}", "g")

Les littéraux d'expressions régulières sont constants et ne peuvent pas être utilisés avec des variables. Ceci pourrait être réalisé en utilisant le constructeur. La structure du constructeur RegEx est 

new RegExp(regularExpressionString, modifiersString)

Vous pouvez incorporer des variables dans le cadre de regularExpressionString. Par exemple, 

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

Cela correspond à n'importe quelle apparence du motif cdcdcd

0
Ben Carp