125 votes

Compter le nombre de correspondances d'une expression rationnelle en Javascript

Je voulais écrire une regex pour compter le nombre d'espaces / de tabulations / de nouvelle ligne dans un bloc de texte. J'ai donc naïvement écrit ce qui suit:

 numSpaces : function(text) { return text.match(/\s/).length; }
 

Pour des raisons inconnues, il retourne toujours 1 . Quel est le problème avec la déclaration ci-dessus? J'ai depuis résolu le problème avec ce qui suit: -

 numSpaces : function(text) { return (text.split(/\s/).length -1); }
 

244voto

Paolo Bergantino Points 199336

Le problème avec votre code initial est qu'il vous manque l' identifiant global :

 >>> 'hi there how are you'.match(/\s/g).length;
4
 

Sans la partie g de l'expression rationnelle, elle ne fera que correspondre à la première occurrence et s'arrêtera là.

Notez également que votre expression rationnelle comptera deux fois les espaces successifs:

 >>> 'hi  there'.match(/\s/g).length;
2
 

Si cela n'est pas souhaitable, vous pouvez le faire:

 >>> 'hi  there'.match(/\s+/g).length;
1
 

11voto

Jack Points 88446

Comme mentionné dans ma précédente réponse, vous pouvez utiliser RegExp.exec() pour itérer sur tous les matchs et de compter chaque occurrence; l'avantage est limité à la mémoire seulement, car dans l'ensemble c'est environ 20% plus lent que d'utiliser String.match().

var re = /\s/g,
count = 0;

while (re.exec(text) !== null) {
    ++count;
}

return count;

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