regulares - regex replace online
¿Cómo puedo escribir una expresión regular que coincida con no codiciosa? (4)
Necesito ayuda sobre la combinación de expresiones regulares con la opción no codiciosa.
El patrón de coincidencia es:
<img/s.*>
El texto a coincidir es:
<html>
<img src="test">
abc
<img
src="a" src=''a'' a=b>
</html>
Pruebo en http://regexpal.com
Esta expresión coincide con todo el texto desde <img
hasta el último >
. Necesito que coincida con la primera encontrada >
después de la inicial <img
, así que aquí necesito obtener dos coincidencias en lugar de la que obtengo.
Probé todas las combinaciones de no codiciosos ?
, sin éxito.
¿Los no codiciosos ?
funciona perfectamente bien Es solo que necesita seleccionar la opción de coincidencias de puntos en todos los motores de expresiones regulares ( regexpal , el motor que utilizó, también tiene esta opción) con la que está probando. Esto se debe a que, en general, los motores de expresiones regulares no coinciden con los saltos de línea cuando los usa .
. Debe decirles explícitamente que también desea hacer coincidir los saltos de línea .
Por ejemplo,
<img/s.*?>
¡funciona bien!
Consulta los resultados aquí .
Además, lea acerca de cómo se comporta el punto en varios sabores de expresiones regulares.
El ?
Operando hace partido no codicioso. Ej .*
Es codicioso mientras .*?
no es Así que puedes usar algo como <img.*?>
hacer coincidir la etiqueta completa. O <img[^>]*>
.
Pero recuerde que todo el conjunto de HTML no se puede analizar con expresiones regulares.
Las otras respuestas aquí presuponen que usted tiene una expresión regular que soporta el emparejamiento no codicioso, que es una extensión introducida en Perl 5 y ampliamente copiada a otros idiomas modernos; pero de ninguna manera es ubicuo. Muchos lenguajes antiguos y editores solo admiten expresiones regulares tradicionales, que no tienen ningún mecanismo para controlar la codicia del operador de repetición *
, siempre coincide con la cadena más larga posible.
El truco entonces es limitar lo que está permitido para que coincida en primer lugar. En lugar de .*
Parece estar buscando
[^>]*
que aún coincide con tantos de algo como sea posible; Pero el algo no es justo .
"cualquier carácter" pero en cambio "cualquier carácter que no sea >
.
Dependiendo de su aplicación, puede o no desear habilitar una opción para permitir que "cualquier carácter" incluya nuevas líneas.
Incluso si su motor de expresiones regulares admite una coincidencia no codiciosa, es mejor explicar lo que realmente quiere decir. Si esto es lo que quiere decir, probablemente debería decir esto, en lugar de confiar en una coincidencia no codiciosa para (con suerte, probablemente) Hacer lo que quiero decir.
Por supuesto, esto todavía no es lo que quiere si necesita lidiar con <img title="quoted string with > in it" src="other attributes"> and perhaps <img title="nested tags">
pero en ese momento , finalmente deberías renunciar al uso de expresiones regulares para esto, como todos te dijimos en primer lugar.
Pregunta de verificación de desbordamiento de pila ¿ Qué significa perezoso y codicioso en el contexto de las expresiones regulares? también.
Los medios codiciosos coinciden con la cadena más larga posible.
Lazy significa hacer coincidir 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''.