Búsqueda global: lastIndex
Cuando se usa una expresión regular con el modificador g se está definiendo una búsqueda global, es decir, que la operación no se detiene tras la primera coincidencia.
En esa situación cada nueva búsqueda comienza en el índice donde se detuvo la anterior. Para conocer este valor se usa la propiedad lastIndex, que pese a ser estática es accesible a través del objeto patrón usado. Su valor se actualzia cada vez que se usa un método de búsqueda, como test() o exec()
var frase;
var patron;
frase = "El día de hoy es soleado, el día anterior fue lluvioso";
patron = /día/ig;
patron.test(frase);
console.log(patron.lastIndex);
patron.test(frase);
console.log(patron.lastIndex);
patron.test(frase);
console.log(patron.lastIndex);
Evidentemente este es un ejemplo para mostrar como acceder a la propiedad lastIndex y como guarda los valores de búsqueda. Nunca vas a usar la b´suqeda global o completa de esta manera.
Para hacer busquedas completas por toda la cadena objetivo se debe usar un buble, bien un bucle do..while o un buble while que se ejecutarán hasta que lastIndex sea 0, cuando no se encuentren más coincidencias
var frase;
var patron;
frase = "El día de hoy es soleado, el día anterior fue lluvioso";
patron = /(día)/ig;
do {
patron.test(frase);
if (patron.lastIndex >0)
console.log("Encontrado en: "+ (patron.lastIndex - RegExp.$1.length) );
} while (patron.lastIndex >0)
Este ejemplo usa un bucle do..while y muestra donde se encuentra cada coincidencia.
Este otro ejemplo también hace una búsqueda completa per con un bucle while
var frase;
var patron;
var contador = 0
frase = "manzana, pera, uvas, manzana, uvas, melón, manzana";
patron = /manzana/ig;
patron.test(frase);
while (patron.lastIndex >0) {
contador++
patron.test(frase);
}
console.log("Hay "+contador+" manzanas")
Observa que en este caso hay que hacer una primera búsqueda para inicializar la propiedad lastindex.
Cualqueira de estos ejemplos puede ejecutarse igualmente con el método exec()