2012-08-10 15 views
191

Necesito ayuda sobre la coincidencia de expresiones regulares con la opción no codiciosa.¿Cómo puedo escribir una expresión regular que coincida con no codicioso?

el patrón de comparación es:

<img\s.*> 

El texto es para que coincida con:

<html> 
<img src="test"> 
abc 
<img 
    src="a" src='a' a=b> 
</html> 

me prueba en http://regexpal.com

Esta expresión coincide todo el texto de <img a durar >. Necesito que coincida con el primero encontrado > después de la inicial <img, así que aquí tendría que conseguir dos coincidencias en lugar de la que obtengo.

Probé todas las combinaciones de no codicioso ?, sin éxito.

+5

¿En qué idioma está ejecutando el REGEX? – Utkanos

+0

Posible duplicado de [RegEx coinciden con las etiquetas abiertas, excepto las etiquetas autocontenidas XHTML] (https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) –

Respuesta

278

El no codicioso ? funciona perfectamente bien. Es solo que necesita seleccionar punto coincide con la opción en los motores de expresiones regulares (regexpal, el motor que utilizó, también tiene esta opción) con los que está probando. Esto se debe a que los motores regex generalmente no coinciden con los saltos de línea cuando usa .. Usted necesita decirle explícitamente que quiere para que coincida con saltos de línea también con .

Por ejemplo,

<img\s.*?> 

funciona bien!

Compruebe results here.

Además, lea sobre how dot behaves en varios sabores regex.

+12

Hay también un truco que puede hacer para evitar esto: como \ s significa "cualquier espacio en blanco", y "\ S" significa "cualquier espacio no en blanco", [\ s \ S] coincidirá con CUALQUIER carácter (como ".", pero incluyendo nueva línea)! Del mismo modo, podría usar [\ d \ D], o [\ w \ W].Esto puede ser un pequeño "truco" bastante útil, y ciertamente es un truco muy útil para tener en cuenta. –

+3

O incluso, en este ejemplo, puede usar: '] *>' para lograr el mismo efecto: dado que "Cualquier carácter que no sea'> '" ¡INCLUYE una nueva línea! –

+1

buena respuesta, pero ¿qué tal bash? echo " bla " | grep -P '' coincide con toda la cadena a pesar de? operador. –

47

El operando ? hace coincidir el no-codicioso. P.ej. .* es codicioso, mientras que .*? no lo es. Entonces puede usar algo como <img.*?> para que coincida con la etiqueta completa. O <img[^>]*>.

Pero recuerde que todo el conjunto de HTML no se puede analizar con expresiones regulares.

+3

Tu respuesta me recordó esto: http://stackoverflow.com/a/1732454/431 –

+2

Creo que es más claro decir que '* ? 'es la versión no codiciosa de' * '. – golopot

2

Revise la pregunta sobre el desbordamiento de la pila What do lazy and greedy mean in the context of regular expressions? también.

Greedy significa que coincide con la cadena más larga posible.

Lazy significa coincidir con la cadena más corta posible.

Por ejemplo, el codicioso h. + L coincide con 'infierno' en 'hola', pero el perezoso h. +? L coincide con 'hel'.

Cuestiones relacionadas