2011-07-18 12 views
5

Me gustaría poder hacer coincidir una secuencia específica de caracteres, comenzando con una subcadena particular y terminando con una subcadena particular. Mi expresión positiva de preanálisis funciona si solo hay una instancia para unir en una línea, pero no si debe haber múltiples coincidencias en una línea. Entiendo que esto es porque (. +) Captura todo hasta que se encuentra última expresión positiva de búsqueda anticipada. Sería bueno si capturara todo hasta que se encuentre la primera expresión.¿Usar expresiones regulares para hacer coincidir cualquier carácter hasta que se alcance una subcadena?

Aquí es mi expresión regular intento: entrada

@@FOO\[(.*)(?=~~)~~(.*)(?=\]@@)\]@@ 

muestra:

@@FOO[abc~~hi]@@ @@FOO[def~~hey]@@ 

salida deseada: 2 partidos, con 2 grupos que coinciden con cada uno (abc, Hawai) y (def, hey).

salida real: 1 partido con 2 grupos (abc ~~ hi] @@ @@ FOO [def, hey)

¿Hay una manera de conseguir el resultado deseado?

¡Gracias de antemano!

Respuesta

5

Utilice el signo de interrogación, coincidirá el menor número de veces posible.

@@FOO\[(.*?)(?=~~)~~(.*?)(?=\]@@)\]@@ 

Este también funciona, pero no es tan estricta, aunque más fácil de leer

@@FOO\[(.*?)~~(.*?)\]@@ 
+0

¡Gracias, esto es exactamente lo que estaba buscando! Al investigar esto, me centré tanto en los constructos de agrupación que pasé por alto por completo *. – joshm1

+1

De hecho, casi siempre uso '. *?' En lugar de simplemente '. *' Porque casi nunca me refiero a "coincidencia tanto como sea posible" –

0

En su lugar, podría utilizar el método String.IndexOf() para encontrar la primera aparición de su subcadena.

3

El operador * es greedy por defecto, lo que significa que se come tanto de la cadena como sea posible mientras que todavía deja suficiente para que coincida con la expresión regular restante. Puedes hacerlo no codicioso añadiendo un? lo. Asegúrese de leer sobre las diferencias en el enlace.

+2

Gracias. En años de usar expresiones regulares para varios idiomas, nunca supe sobre *? – joshm1

Cuestiones relacionadas