Cuando repite un grupo de captura, en la mayoría de los sabores, solo se conserva la última captura; cualquier captura anterior se sobrescribe. De alguna manera, por ejemplo .NET, puede obtener todas las capturas intermedias, pero este no es el caso de Javascript.
Es decir, en Javascript, si tiene un patrón con N grupos de captura, solo puede capturar exactamente N cadenas por coincidencia, incluso si algunos de esos grupos se repitieron.
Entonces, en términos generales, dependiendo de lo que necesite hacer:
- Si es una opción, divida en delimitadores
- En lugar de coincidir
/(pattern)+/
, tal vez coincida /pattern/g
, tal vez en un exec
bucle
- Tenga en cuenta que estos dos no son exactamente equivalentes, pero puede ser una opción
- Haga coincidir multinivel:
- Captura el grupo repetido en un partido
- Luego ejecuta otra expresión regular para romper esa coincidencia
Referencias
Ejemplo
Aquí hay un ejemplo de coincidencia <some;words;here>
en un texto, usando un exec
bucle y luego dividiendo ;
para obtener palabras individuales ( ver también en ideone.com ):
var text = "a;b;<c;d;e;f>;g;h;i;<no no no>;j;k;<xx;yy;zz>";
var r = /<(\w+(;\w+)*)>/g;
var match;
while ((match = r.exec(text)) != null) {
print(match[1].split(";"));
}
El patrón utilizado es:
_2__
/ \
<(\w+(;\w+)*)>
\__________/
1
Esto coincide <word>
, <word;another>
, <word;another;please>
, etc. Grupo 2 se repite para capturar cualquier número de palabras, pero sólo pueden mantener la última captura. La lista completa de palabras es capturada por el grupo 1; esta cadena está entonces split
en el delimitador de punto y coma.
Preguntas relacionadas