2009-01-28 8 views
42

Possible en double:
Escape string for use in Javascript regexvariables passant à une expression rationnelle en javascript

J'ai un msg comme ceci:

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

et moi avons une fonction pour créer un message en utilisant les arguments passés comme

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

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

Quelle est la manière d'y parvenir?

+2

@casperOne, quel est le doublon? Ni [cette question] (http://stackoverflow.com/questions/4029109/javascript-regex-how-to-put-a-variable-inside-a-regular-expression) ni [cette question] (http: // stackoverflow.com/questions/494035/how-do-you-pass-a-variable-to-a-regular-expression-javascript) étaient les mêmes que cette question. Cette question est importante car elle montre réellement le mélange d'une variable chaîne dans un modèle regex, alors que les réponses des autres questions ne fournissaient que des exemples où les caractères d'échappement n'étaient pas un problème. – MandM

Répondre

52

Votre expression rationnelle est /{0}/gi puisque vous l'avez créée à partir d'une chaîne. Et ce n'est pas une expression valide. Vous devez échapper {dans l'expression rationnelle parce qu'elle a une signification particulière dans la syntaxe regexp, il devrait donc être:

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

qui est /\\{0\\}/gi. Vous devez échapper l'échappement \\ dans la chaîne.

+0

a travaillé comme une brise fraîche. Merci. – Nrj

3

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

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

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

+0

Oui c'est comme ça, mais ça ne permet pas d'en créer un. Dit "quantificateur invalide". – Nrj

6

Je vous encourage fortement à utiliser la forme fonctionnelle String.replace() pour résoudre votre problème, plutôt que d'essayer de paramétrer l'expression rationnelle dans une boucle for qui se répète sur {0}, {1}, etc. En d'autres termes, plutôt que de rechercher '{0}' ou '{1}', il suffit de rechercher '{([0-9] +)}' (ie {} entourant un nombre arbitraire, et passez une fonction à la fonction replace() pour remplacer intelligemment ces expressions en fonction du nombre entre les {}. Cela vous permet d'utiliser un littéral RegExp que vous pouvez écrire comme/{([0-9] +)}/. plutôt que mess 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)]; } 
); 

qui donne

the song says zero little one little two little-endians 

Voir ceci similar question.

edit: si vous voulez laisser seuls points qui sont supérieures à la longueur de votre liste args, assurez-vous de bon sens 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;} 
); 

qui donne

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