J'ai donc un RegExp regex = /asd/
Je le stocke comme clé dans mon système de magasin à clés.
Je dis donc str = String(regex)
qui renvoie "/asd/"
.
Maintenant, je dois reconvertir cette chaîne en RegExp.
Alors j'essaie: RegExp(str)
et je vois /\/asd\//
ce n'est pas ce que je veux. Ce n'est pas la même chose que /asd/
Devrais-je simplement supprimer les premier et dernier caractères de la chaîne avant de la convertir en regex? Cela me donnerait le résultat souhaité dans cette situation, mais ne fonctionnerait pas nécessairement si RegExp avait des modificateurs comme /i
ou /g
Y a-t-il une meilleure manière de faire cela?
Si vous n'avez pas besoin de stocker les modificateurs, vous pouvez utiliser Regexp#source
pour obtenir la valeur de chaîne, puis reconvertir à l'aide du constructeur RegExp
.
var regex = /abc/g;
var str = regex.source; // "abc"
var restoreRegex = new RegExp(str, "g");
Si vous avez besoin de stocker les modificateurs, utilisez une expression rationnelle pour analyser l'expression rationnelle:
var regex = /abc/g;
var str = regex.toString(); // "/abc/g"
var parts = /\/(.*)\/(.*)/.exec(str);
var restoredRegex = new RegExp(parts[1], parts[2]);
Cela fonctionnera même si le modèle contient un /
, car .*
est glouton et passera au dernier /
de la chaîne.
Si les performances sont un problème, utilisez la manipulation de chaîne normale en utilisant String#lastIndexOf
:
var regex = /abc/g;
var str = regex.toString(); // "/abc/g"
var lastSlash = str.lastIndexOf("/");
var restoredRegex = new RegExp(str.slice(1, lastSlash), str.slice(lastSlash + 1));
Vous pouvez utiliser les éléments suivants avant le stockage de votre littéral regex:
(new RegExp(regex)).source
Voir https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/source
Exemple:
regex = /asd/
string = (new RegExp(regex)).source
// string is now "asd"
regex = RegExp(string)
// regex has the original value /asd/
regex = /asd/;
str = regex.source;
str
sera "asd", évitant ainsi les problèmes de barre oblique.