Javascript: comment obtenir plusieurs résultats dans les résultats RegEx .exec

Quand je cours

/(a)/g.exec('aaa ').length 

Je reçois

 2 

Mais je pensais qu'il devrait retourner

 3 

Parce qu'il y a 3 a s dans la chaîne, pas 2!

Pourquoi donc?

Je veux pouvoir rechercher toutes les occurrences d'une chaîne dans RegEx et l'itérer sur elles.

FWIW: j'utilise node.js

exec() ne retourne que l'ensemble des captures pour la première correspondance, et non l'ensemble des correspondances que vous attendez. Donc, ce que vous voyez vraiment, c'est $0 (la correspondance entière, "a") et $1 (la première capture) – c'est-à-dire un ensemble de longueur 2. exec() pendant ce temps est conçu pour que vous puissiez l'appeler à nouveau pour obtenir le Capture le prochain match. De MDN :

Si votre expression régulière utilise le drapeau "g", vous pouvez utiliser la méthode exec plusieurs fois pour trouver les correspondances successives dans la même chaîne. Lorsque vous le faites, la recherche commence à la sous-chaîne de str spécifiée par la propriété lastIndex de l'expression régulière (le test avancera également la propriété lastIndex).

Vous pouvez utiliser la match place:

 'aa a'.match(/(a)/g).length // outputs: 3 

Vous n'êtes que le premier a. La raison pour laquelle la longueur est deux, c'est qu'il trouve la première correspondance et la partie du groupe parenthèse du premier match. Dans votre cas, ils sont les mêmes.

Considérez cet exemple.

 var a = /b(a)/g.exec('ba ba ba '); alert(a); 

Il produit ba, a . La longueur du tableau est encore 2, mais il est plus évident ce qui se passe. "Ba" est le match complet. a est la première combinaison de parenthèse.

La documentation MDN prend en charge ceci: que seule la première série et les groupes contenus sont renvoyés. Pour trouver toutes les correspondances, vous utiliserez match () comme indiqué par mVChr.