web-dev-qa-db-fra.com

Javascript Regexp génération dynamique à partir de variables?

Comment construire deux modèles de regex en un?

Par exemple, j'ai un motif long et un motif plus petit, il faut que je mette un motif plus petit devant un motif long.

var pattern1 = ':\(|:=\(|:-\(';
var pattern2 = ':\(|:=\(|:-\(|:\(|:=\(|:-\('
str.match('/'+pattern1+'|'+pattern2+'/gi');

Ça ne marche pas. Lorsque je concatène des chaînes, toutes les barres obliques ont disparu.

99
Somebody

Vous devez utiliser RegExp :

str.match(new RegExp(pattern1+'|'+pattern2, 'gi'));

Lorsque je concatène des chaînes, toutes les barres obliques ont disparu.

Si vous avez une barre oblique inversée dans votre modèle pour échapper à un caractère regex spécial (comme \(), Vous devez utiliser deux barres obliques inverses dans la chaîne (car \ est le caractère d'échappement d'une chaîne): new RegExp('\\(') serait identique à /\(/.

Donc, vos modèles doivent devenir:

var pattern1 = ':\\(|:=\\(|:-\\(';
var pattern2 = ':\\(|:=\\(|:-\\(|:\\(|:=\\(|:-\\(';
177
Felix Kling

Utilisez le ci-dessous:

var regEx = new RegExp(pattern1+'|'+pattern2, 'gi');

str.match(regEx);
20
adarshr

Vous devez renoncer au littéral d'expression rationnelle et utiliser le constructeur d'objet, où vous pouvez passer l'expression rationnelle sous forme de chaîne.

var regex = new RegExp(pattern1+'|'+pattern2, 'gi');
str.match(regex);
9
alex

Le constructeur RegExp crée un objet d'expression régulière pour faire correspondre le texte à un motif.

    var pattern1 = ':\\(|:=\\(|:-\\(';
    var pattern2 = ':\\(|:=\\(|:-\\(|:\\(|:=\\(|:-\\(';
    var regex = new RegExp(pattern1 + '|' + pattern2, 'gi');
    str.match(regex);

Le code ci-dessus fonctionne parfaitement pour moi ...

2
Vinoth Narayan