Question Comment utilisez-vous une variable dans une expression régulière?


Je voudrais créer une méthode String.replaceAll () en JavaScript et je pense que l'utilisation d'un RegEx serait la façon la plus concise de le faire. Cependant, je ne peux pas comprendre comment passer une variable dans un RegEx. Je peux déjà faire cela qui remplacera toutes les instances de "B" par "A".

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

Mais je veux faire quelque chose comme ça:

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

Mais évidemment, cela ne remplacera que le texte "replaceThis" ... alors comment transmettre cette variable à ma chaîne RegEx?


980
2018-01-30 00:11


origine


Réponses:


Au lieu d'utiliser le /regex/g syntaxe, vous pouvez construire une nouvelle RegExp objet:

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

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

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

1379
2018-01-30 00:15



Comme l'a mentionné Eric Wendelin, vous pouvez faire quelque chose comme ça:

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

Cela donne "regex matching .". Cependant, il échouera si str1 est ".". Vous vous attendriez à ce que le résultat soit "pattern matching regex", en remplaçant la période par "regex", mais ça va être ...

regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex

C'est parce que, bien que "." est une chaîne, dans le constructeur RegExp, elle est toujours interprétée comme une expression régulière, ce qui signifie tout caractère non-line-break, c'est-à-dire tous les caractères de la chaîne. Pour ce faire, la fonction suivante peut être utile:

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

Alors vous pouvez faire:

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

cédant "pattern matching regex".


167
2018-01-30 01:02



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

Comme toujours: n'utilisez pas regex à moins d'y être obligé. Pour remplacer une chaîne simple, l'idiome est:

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

Ensuite, vous n'avez pas à vous soucier des problèmes de citations mentionnés dans la réponse de Gracenotes.


83
2018-02-01 03:43



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

var alpha = 'fig';
'food fight'.match(alpha + 'ht')[0]; // fight

27
2017-11-28 15:32



Ce:

var txt=new RegExp(pattern,attributes);

est équivalent à ceci:

var txt=/pattern/attributes;

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


20
2018-01-30 00:19



this.replace( new RegExp( replaceThis, 'g' ), withThis );

14
2018-01-30 00:16



String.prototype.replaceAll = function (replaceThis, withThis) {
   var re = new RegExp(replaceThis,"g"); 
   return this.replace(re, withThis);
};
var aa = "abab54..aba".replaceAll("\\.", "v");

Testez avec ceci outil 


9
2018-02-01 09:14



Vous voulez construire l'expression régulière dynamiquement et pour cela, la bonne solution est d'utiliser le new RegExp(string) constructeur. Pour que le constructeur traite les caractères spéciaux Littéralement, vous devez leur échapper. Il y a une fonction intégrée dans widget d'auto-complétion jQuery UI appelé $.ui.autocomplete.escapeRegex:

[...] vous pouvez utiliser le built-in    $.ui.autocomplete.escapeRegex fonction. Ça va prendre une seule corde   argument et échapper tous les caractères regex, ce qui rend le résultat sûr à   passer au new RegExp().

Si vous utilisez jQuery UI, vous pouvez utiliser cette fonction ou copier sa définition de la source:

function escapeRegex(value) {
    return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
}

Et utilisez-le comme ceci:

"[z-a][z-a][z-a]".replace(new RegExp(escapeRegex("[z-a]"), "g"), "[a-z]");
//            escapeRegex("[z-a]")       -> "\[z\-a\]"
// new RegExp(escapeRegex("[z-a]"), "g") -> /\[z\-a\]/g
// end result                            -> "[a-z][a-z][a-z]"

7
2017-09-14 19:55



Alors que vous pouvez créer des RegExp créés dynamiquement (comme dans les autres réponses à cette question), je vais faire écho à mon commentaire d'un post similaire: La forme fonctionnelle de String.replace () est extrêmement utile et, dans de nombreux cas, réduit le besoin d'objets RegExp créés dynamiquement. (qui sont un peu pénibles parce que vous devez exprimer l'entrée au constructeur RegExp comme une chaîne plutôt que d'utiliser le format littéral slashs / ​​[A-Z] + / regexp)


3
2018-01-30 01:02



Voici une autre implémentation de replaceAll:

    String.prototype.replaceAll = function (stringToFind, stringToReplace) {
        if ( stringToFind == stringToReplace) return this;
        var temp = this;
        var index = temp.indexOf(stringToFind);
        while (index != -1) {
            temp = temp.replace(stringToFind, stringToReplace);
            index = temp.indexOf(stringToFind);
        }
        return temp;
    };

3
2018-05-08 10:30



Pour satisfaire mon besoin d'insérer une variable / alias / fonction dans une expression régulière, voici ce que j'ai trouvé:

oldre = /xx\(""\)/;
function newre(e){
    return RegExp(e.toString().replace(/\//g,"").replace(/xx/g, yy), "g")
};

String.prototype.replaceAll = this.replace(newre(oldre), "withThis");

où 'oldre' est l'expression rationnelle originale que je veux insérer une variable, 'xx' est l'espace réservé pour cette variable / alias / fonction, et 'yy' est le nom, l'alias ou la fonction de la variable.


3
2018-06-05 04:22