web-dev-qa-db-fra.com

javascript new regexp from string

J'essaie de créer quelque chose semblable à ceci:

var regexp_loc = /e/i;

sauf que je veux que l'expression rationnelle soit dépendante d'une chaîne, alors j'ai essayé d'utiliser le nouveau RegExp mais je n'ai pas pu obtenir ce que je voulais.

En gros, je veux que la variable e dans l'expression rationnelle ci-dessus soit une variable de chaîne, mais j'échoue avec la syntaxe.

J'ai essayé quelque chose comme ça:

var keyword = "something";

var test_regexp = new RegExp("/" + keyword + "/i");

En gros, je souhaite rechercher une chaîne secondaire dans une chaîne plus grande, puis la remplacer par une autre chaîne, insensible à la casse.

salutations, alexander

51
Alexander

Vous devez passer le paramètre second :

var r = new RegExp(keyword, "i");

Vous devrez également échapper à tous les caractères spéciaux de la chaîne pour empêcher les attaques par injection de regex.

71
SLaks

Vous devez également vous rappeler de faire attention aux caractères d'échappement dans une chaîne ... 

Par exemple, si vous souhaitez détecter un seul numéro\d {1} et que vous l'avez fait ...

var pattern = "\d{1}";
var re = new RegExp(pattern);

re.exec("1"); // fail! :(

cela échouerait car l'initiale est un caractère d'échappement, vous devez "échapper à l'évasion", comme si.

var pattern = "\\d{1}" // <-- spot the extra '\'
var re = new RegExp(pattern);

re.exec("1"); // success! :D
40
Ric Paton

Lors de l'utilisation du constructeur RegExp, vous n'avez pas besoin des barres obliques, contrairement à l'utilisation d'un littéral d'expression rationnelle. Alors:

new RegExp(keyword, "i");

Notez que vous transmettez les drapeaux dans le deuxième paramètre. Voir ici pour plus d'informations.

11
James Sulak

Vous souhaitez partager un exemple ici: Je souhaite remplacer une chaîne telle que: hi [var1] [var2] par hi [newVar] [var2] . Et var1 sont générés de manière dynamique dans la page.

j'ai donc dû utiliser: var regex = new RegExp ("\\ [" + var1 + "\\]", 'ig'); mystring.replace (regex, '[newVar]');

Cela fonctionne très bien pour moi. au cas où quelqu'un aurait besoin de ça comme moi ... La raison pour laquelle je dois utiliser [] est var1 pourrait être un motif très facile en lui-même, ajoutant que le [] serait beaucoup plus précis.

1
liudaxingtx

Vous devez convertir RegExp , vous pouvez créer une fonction simple pour le faire pour vous:

function toReg(str) {
  if(!str || typeof str !== "string") {
    return;
  }
  return new RegExp(str, "i");
}

et appelez comme ça:

toReg("something")
0
Alireza

var mot-clé = "quelque chose";

var test_regexp = new RegExp(something,"i");
0
Harshal Khatri