buenas...
no creo que match sea tu mejor aliado para este caso debido a la forma como funciona. para obtener la posición ‒ o índice ‒ de la coincidencia con match, el patrón no puede ser global. pero entonces, si el patrón no es global, solo obtienes la primera coincidencia, no importa cuantas veces lo invoques.
Código:
// en este ejemplo voy a usar variables para demostrar que los estados no se mantienen ;
var txt = "texto_nµ€þø";
var regex = /\W/;
var match01 = txt.match(regex);
var match02 = txt.match(regex);
si exploras en una consola las variables
match01 y
match02, ambas tienen el mismo resultado: un array de un solo elemento con el símbolo micro ‒ µ ‒, y una propiedad adicional que indica la posición de la coincidencia — index — con el valor siete. si intentas el mismo ejemplo pero con un patrón global
/\W/g, las variables representarían un array de cuatro elementos: µ, €, þ, ø. a diferencia del anterior, esta vez no tiene la propiedad
index, por tanto es imposible saber las posiciones.
en este caso, tu mejor aliado es el método
exec de las expresiones regulares. exec, además de informarte de la posición, te permite ir coincidencia por coincidencia en pasos. adaptando el ejemplo anterior:
Código:
var txt = "texto_nµ€þø", regex = /\W/g, match;
while(match = regex.exec(txt)) console.log(match.index);
// en consola se imprime: 7, 8, 9, 10