1699 votes

Comment passer une variable dans une Expression Régulière JavaScript?

Je voudrais créer une Chaîne de caractères.replaceAll() la méthode en JavaScript et je pense que l'aide d'une RegEx serait plus laconique façon de le faire. Cependant, je ne peux pas comprendre comment passer une variable dans une expression régulière. Je peux le faire déjà, c'est ce qui va remplacer toutes les instances de "B" avec "Un".

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

Mais je veux faire quelque chose comme ceci:

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

Mais, évidemment, cela ne fera que remplacer le texte "replaceThis"...alors, comment puis-je passer cette variable à ma chaîne RegEx?

2200voto

Eric Wendelin Points 13805

Au lieu d'utiliser l' /regex/g de la syntaxe, vous pouvez construire un nouveau RegExp objet:

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

Vous pouvez créer dynamiquement des regex objets de cette façon. Alors vous ferez:

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

249voto

Gracenotes Points 784

Comme Eric Wendelin mentionné précédemment, vous pouvez faire quelque chose comme ceci:

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

Cette rendements en "regex matching .". Toutefois, il ne sera pas si str1 est - ".". Vous attendez les résultats de l' "pattern matching regex", en remplacement de la période de la "regex", mais il s'en sortira...

regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex

C'est parce que, bien qu' "." est une Chaîne de caractères, dans le constructeur RegExp c'est toujours interprété comme une expression régulière, le sens de toute non-line-break caractère, ce qui signifie que chaque caractère dans la chaîne. À cette fin, la fonction suivante peut être utile:

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

Ensuite, vous pouvez faire:

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

rendement "pattern matching regex".

137voto

bobince Points 270740

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

Comme toujours: ne pas utiliser des regex, sauf si vous avez. Pour une simple chaîne de caractères à remplacer, le langage est:

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

Ensuite, vous n'avez pas à vous soucier de la citant les questions mentionnées dans Gracenotes de réponse.

37voto

Steven Penny Points 18523

Pour ceux qui cherchent à utiliser la variable avec le match de la méthode, cela a fonctionné pour moi

var baz = "foo";

var filter = new RegExp(baz + "d");

"food fight".match(filter)[0]; // food

37voto

Jeremy Ruten Points 59989

Ce:

var txt=new RegExp(pattern,attributes);

est équivalent à ceci:

var txt=/pattern/attributes;

Voir http://www.w3schools.com/jsref/jsref_obj_regexp.asp.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X