validate test regulares regexp probar online expresiones example javascript regex repetition capturing-group

test - regexp javascript



Cómo capturar un número arbitrario de grupos en JavaScript Regexp? (4)

Esperaría esta línea de JavaScript:

"foo bar baz".match(/^(/s*/w+)+$/)

para devolver algo como:

["foo bar baz", "foo", " bar", " baz"]

pero, en cambio, solo devuelve el último partido capturado:

["foo bar baz", " baz"]

¿Hay alguna manera de obtener todos los partidos capturados?


¿Qué tal esto? "foo bar baz".match(/(/w+)+/g)


A menos que tenga un requisito más complicado sobre cómo está dividiendo sus cadenas, puede dividirlas y luego devolverlas con la cadena inicial:

var data = "foo bar baz"; var pieces = data.split('' ''); pieces.unshift(data);


Cuando repites un grupo de captura, en la mayoría de los sabores, solo se guarda la última captura; cualquier captura previa se sobrescribe. De alguna forma, por ejemplo .NET, puedes obtener todas las capturas intermedias, pero este no es el caso con 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.

En términos generales, dependiendo de lo que necesite hacer:

  • Si es una opción, divide en lugar de delimitadores
  • En lugar de hacer coincidir /(pattern)+/ , tal vez coincida /pattern/g , quizás en un ciclo de exec
    • Tenga en cuenta que estos dos no son exactamente equivalentes, pero puede ser una opción
  • Hacer una coincidencia multinivel:
    • Capture el grupo repetido en un partido
    • Luego ejecute otra expresión regular para separar ese partido

Referencias

Ejemplo

Aquí hay un ejemplo de cómo hacer coincidir <some;words;here> en un texto, usando un ciclo de exec y luego dividir ; 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(";")); } // c,d,e,f // xx,yy,zz

El patrón utilizado es:

_2__ / / <(/w+(;/w+)*)> /__________/ 1

Esto coincide con <word> , <word;another> , <word;another;please> , etc. El Grupo 2 se repite para capturar cualquier cantidad de palabras, pero solo puede mantener la última captura. La lista completa de palabras es capturada por el grupo 1; esta cadena se split en el delimitador de punto y coma.

Preguntas relacionadas


intenta usar ''g'':

"foo bar baz".match(//w+/g)