2012-06-29 6 views

Respuesta

29

exec() está volviendo solamente el conjunto de capturas para el primer partido, no el conjunto de coincidencias mientras esperar. Entonces, lo que realmente está viendo es $0 (la coincidencia completa, "a") y $1 (la primera captura) - es decir. un conjunto de longitud 2. exec() mientras tanto está diseñado para que pueda llamarlo nuevamente para obtener las capturas del siguiente coincidencia. De MDN:

Si su expresión regular utiliza la "g" de la bandera, se puede utilizar el método exec varias veces para encontrar coincidencias sucesivas en la misma cadena. Cuando lo hace, la búsqueda comienza en la subcadena de str especificada por la propiedad lastIndex de la expresión regular (la prueba también avanzará la propiedad lastIndex).

+2

Por cierto, todo el partido es '$ &' en js. – Qtax

+0

Interesante, ni siquiera sabía que hubiera tales variables '' $ '' en JS. Estaba hablando en Perl. :) Bueno saberlo, sin embargo. –

+2

'MDN' =' + 1' –

19

Usted podría utilizar en lugar match:

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

De hecho, 'match' es la herramienta ideal para este caso, siempre que el PO no necesita subgrupos dentro de cada partido. – apsillers

+1

Siempre que haya al menos una coincidencia. De lo contrario, 'match' devuelve' null' en lugar de una matriz vacía. – Robert

6

Solo concuerda con el primero a. La razón por la que la longitud es dos es que está encontrando la primera coincidencia y la parte del grupo entre paréntesis de la primera coincidencia. En tu caso, son lo mismo.

Considere este ejemplo.

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

Emite ba, a. La longitud de la matriz sigue siendo 2, pero es más obvio lo que está sucediendo. "ba" es la coincidencia completa. a es la primera coincidencia de agrupación entre paréntesis.

El MDN documentation admite esto, solo se devuelve la primera coincidencia y los grupos contenidos. Para encontrar todas las coincidencias, usaría match() según lo establecido por mVChr.

3

Código:

alert('a a a'.match(/(a)/g).length); 

Salida:

3 
Cuestiones relacionadas