web-dev-qa-db-fra.com

convertir RegExp en chaîne puis de nouveau en RegExp

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?

21
max pleaner

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));
23
4castle

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/
1
jedifans
regex = /asd/;
str = regex.source;

str sera "asd", évitant ainsi les problèmes de barre oblique.

0
Craigo