44 votes

passer une variable à une expression rationnelle en javascript

Double Possible:
Échapper à la chaîne pour utiliser les regex en Javascript

J'ai un msg comme ceci:

Max {0} caractères autorisés dans {1}

Et j'ai une fonction pour créer un message en utilisant les arguments passés en tant que

for(var i = 0; i < agrs.length; i++){
    reg = new RegExp('\{'+i+'\}', 'gi');
    key = key.replace(reg,agrs[i])
}

Le problème est qu'il n'est pas en mesure de prendre le param i pour créer le reg exp.

Ce qui est le chemin pour y parvenir?

57voto

artificialidiot Points 3584

Votre expression rationnelle est / {0} / gi puisque vous la créez à partir d'une chaîne. Et ce n'est pas une expression valide. Vous devez échapper à {dans l'expression rationnelle, car cette syntaxe a une signification particulière dans la syntaxe de l'expression rationnelle.

 new RegExp('\\{'+i+'\\}', 'gi');
 

qui est / \ {0 \} / gi. Vous devez échapper le caractère d'échappement \ dans la chaîne.

6voto

Jason S Points 58434

Je vous encourage fortement à utiliser la forme fonctionnelle de la Chaîne.replace() pour résoudre votre problème, plutôt que d'essayer de paramétrer les regexp dans une boucle qui itère sur {0},{1},etc.

En d'autres termes, plutôt que de rechercher pour "{0} " ou " {1}', il suffit de regarder pour '{([0-9]+)}' (c'est à dire {} s'entourant un nombre arbitraire, et de passer d'une fonction à la fonction de remplacement() intelligemment remplacer ces expressions basées sur le nombre entre les {} s'. Cela vous permet d'utiliser une RegExp littéral que vous pouvez écrire en tant que /{([0-9]+)}/ plutôt que de perdre son temps avec des caractères d'échappement dans les chaînes.

Quelque chose comme ceci:

s='the song says {0} little {1} little {2} little-endians';
args=['zero','one','two'];
new_string = s.replace(/{([0-9]+)}/g, function(wholematch,firstmatch)
  {return args[(+firstmatch)]; }
);

ce qui donne

the song says zero little one little two little-endians

Voir cette question semblable.

edit: si vous voulez laisser seuls éléments qui sont supérieures à la longueur de votre args la liste, assurez-vous de la santé mentale-vérifier le numéro de paramètre:

s='the song says {0} little {1} little {2} little-endians,\n'+
  ' {3} little {4} little {5} little-endians';
args=['zero','one','two'];
new_string = s.replace(/{([0-9]+)}/g, function(wholematch,firstmatch)
  {var i = +firstmatch; return i < args.length ? args[i] : wholematch;}
);

ce qui donne

the song says zero little one little two little-endians,
 {3} little {4} little {5} little-endians

3voto

Gareth Points 42402

Je pense que votre deuxième ligne est censée être

 reg = new RegExp('\{'+i+'\}', 'gi');
 

mais je ne sais pas si c'est votre seul problème ou pas.

1voto

CoolAJ86 Points 19341
 function escapeRegExp(str) {
  return str.replace(/[-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}

var re = new RegExp(escapeRegExp(str));   
 

Voir: Chaîne d'échappement à utiliser dans une expression rationnelle Javascript

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