node - regexp javascript
Javascript: cómo obtener múltiples coincidencias en los resultados RegEx.exec (5)
Podrías usar match
lugar:
''a a a''.match(/(a)/g).length // outputs: 3
Cuando corro
/(a)/g.exec(''a a a '').length
yo obtengo
2
pero pensé que debería volver
3
porque hay 3 a
s en la cadena, no 2!
¿Porqué es eso?
Quiero poder buscar todas las apariciones de una cadena en RegEx e iterar sobre ellas.
FWIW: Estoy usando node.js
Solo estas emparejando la primera 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.
Considera este ejemplo.
var a = /b(a)/g.exec(''ba ba ba '');
alert(a);
Produce ba, a
. La longitud de la matriz sigue siendo 2, pero es más obvio lo que está sucediendo. "ba" es el partido completo. a
es la primera coincidencia de agrupación entre paréntesis.
La MDN admite esto: solo se devuelven los primeros grupos coincidentes y contenidos. Para encontrar todas las coincidencias, debe usar match () como lo indica mVChr.
exec()
está devolviendo solo el conjunto de capturas para la primera coincidencia, no el conjunto de coincidencias como se espera. Entonces, lo que realmente está viendo es $0
(la coincidencia completa, "a") y $1
(la primera captura), es decir, una serie de longitud 2. exec()
mientras tanto, está diseñado para que pueda volver a llamar para obtener el Capturas para el próximo partido. Desde MDN :
Si su expresión regular usa el indicador "g", puede usar el método exec varias veces para encontrar coincidencias sucesivas en la misma cadena. Al hacerlo, 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).
Código:
alert(''a a a''.match(/(a)/g).length);
Salida:
3
mientras que el bucle puede ayudarte
x = ''a a a a'';
y = new RegExp(/a/g);
while(null != (z=y.exec(x))) {
console.log(z); // output: object
console.log(z[0]); // ouput: "a"
}
Si agregas un contador, obtienes la longitud del mismo.
x = ''a a a a'';
counter = 0;
y = new RegExp(/a/g);
while(null != (z=y.exec(x))) {
console.log(z); // output: object
console.log(z[0]); // output: "a"
counter++;
}
console.log(counter); // output: 4
Esto es bastante seguro, incluso si no encuentra ninguna coincidencia, simplemente sale y el contador será 0
La intención principal es decir cómo se puede usar RegExp para hacer un bucle y obtener todos los valores de la cadena del mismo RegExp coincidente