191 votes

Comment puis-je concaténer des regex littéraux en Javascript?

Est-il possible de faire quelque chose comme cela?

var pattern = /some regex segment/ + /* comment here */
    /another segment/;

Ou dois-je utiliser de nouveaux RegExp() de la syntaxe et de concaténer une chaîne de caractères? Je préfère utiliser le littéral, comme le code est à la fois plus évidente et concis.

223voto

Jerub Points 17488

Voici comment créer une expression régulière sans l'aide de l'expression régulière la syntaxe littérale. Cela vous permet de faire arbitraire de manipulation de chaîne avant qu'elle ne devienne un objet d'expression régulière:

var segment_part = "some bit of the regexp";
var pattern = new RegExp("some regex segment" + /*comment here */
              segment_part + /* that was defined just now */
              "another segment");

Si vous avez deux littéraux d'expressions régulières, vous pouvez, en fait, de les enchaîner à l'aide de cette technique:

var expression_one = /foo/;
var expression_two = /bar/;
var expression_three = new RegExp(expression_one.source + expression_two.source);

Il n'est pas entièrement une bonne solution, car vous perdez les indicateurs qui ont été mis sur expression_one et expression_two, et il est plus bavard que d'avoir l'expression de un et de deux chaînes de caractères littérales au lieu de littéral des expressions régulières.

46voto

Japheth Salva Points 18

Au hasard de la concaténation des expressions régulières objets peuvent avoir certains effets secondaires indésirables. Utiliser les RegExp.source :

var r1 = /abc/g;
var r2 = /def/;
var r3 = new RegExp(r1.source + r2.source, 
                   (r1.global ? 'g' : '') 
                   + (r1.ignoreCase ? 'i' : '') + 
                   (r1.multiline ? 'm' : ''));
var m = 'test that abcdef and abcdef has a match?'.match(r3);
// m should contain 2 matches

Cela permettra également de vous donner la possibilité de conserver l'expression régulière drapeaux à partir d'une précédente RegExp à l'aide de la norme RegExp drapeaux.

jsFiddle

23voto

Alex Points 41

Je n'ai pas tout à fait d'accord avec le "eval" option.

var xxx = /abcd/;
var yyy = /efgh/;
var zzz = new RegExp(eval(xxx)+eval(yyy));

donnera "//abcd//efgh//", ce qui n'est pas le résultat escompté.

L'aide de la source comme

var zzz = new RegExp(xxx.source+yyy.source);

donnera "/abcdefgh/" et que c'est correct.

Logicaly il n'est pas nécessaire d'ÉVALUER, vous savez que votre EXPRESSION. Vous avez juste besoin de la SOURCE ou de la façon dont il est écrit pas nécessairement sa valeur. Comme pour les drapeaux, il vous suffit d'utiliser l'argument optionnel de RegExp.

Dans ma situation, je dois courir à la question de l' ^ et $ utilisé dans plusieurs expression je suis en train de concaténer ensemble! Ces expressions sont la grammaire filtres utilisés à travers le programme. Maintenant, je wan pas pour les utiliser ensemble pour traiter le cas des PRÉPOSITIONS. J'ai peut-être à "découper" les sources de supprimer le début et la fin ^( et/ou )$ :) Cheers, Alex.

2voto

ph7 Points 26

Utiliser le constructeur avec 2 params et d'éviter le problème avec fuite de '/':

var re_final = new RegExp("\\" + ".", "g");    // constructor can have 2 params!
console.log("...finally".replace(re_final, "!") + "\n" + re_final + 
    " works as expected...");                  // !!!finally works as expected

                         // meanwhile

re_final = new RegExp("\\" + "." + "g");              // appends final '/'
console.log("... finally".replace(re_final, "!"));    // ...finally
console.log(re_final, "does not work!");              // does not work

1voto

roenving Points 1194

Vous aurez à utiliser new RegExp !-)

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