¿Qué significan "vago" y "codicioso" en el contexto de las expresiones regulares?

Resuelto ajsie asked hace 14 años • 13 respuestas

¿Cuáles son estos dos términos de una manera comprensible?

ajsie avatar Feb 20 '10 13:02 ajsie
Aceptado

Los codiciosos consumirán tanto como sea posible. En http://www.regular-expressions.info/repeat.html vemos el ejemplo de intentar hacer coincidir etiquetas HTML con <.+>. Supongamos que tiene lo siguiente:

<em>Hello World</em>

Puede pensar que <.+>( .significa cualquier carácter que no sea de nueva línea y +significa uno o más ) solo coincidiría con el <em>y el </em>, cuando en realidad será muy codicioso e irá del primero <al último >. Esto significa que coincidirá <em>Hello World</em>en lugar de lo que querías.

Hacerlo perezoso ( <.+?>) evitará esto. Al agregar ?después de +, le decimos que se repita la menor cantidad de veces posible , de modo que lo primero >que aparezca es donde queremos detener la coincidencia.

Te animo a que descargues RegExr , una gran herramienta que te ayudará a explorar las expresiones regulares; yo la uso todo el tiempo.

Sampson avatar Feb 20 '2010 06:02 Sampson

'Codicioso' significa hacer coincidir la cadena más larga posible.

'Lazy' significa hacer coincidir la cadena más corta posible.

Por ejemplo, los codiciosos h.+lcoinciden 'hell'pero 'hello'los perezosos h.+?lcoinciden 'hel'.

slebetman avatar Feb 20 '2010 06:02 slebetman
Cuantificador codicioso Cuantificador perezoso Descripción
* *? Cuantificador de estrellas: 0 o más
+ +? Cuantificador Plus: 1 o más
? ?? Cuantificador opcional: 0 o 1
{n} {n}? Cuantificador: exactamente n
{n,} {n,}? Cuantificador: no más
{n,m} {n,m}? Cuantificador: entre n y m

Agrega un ? a un cuantificador para hacerlo codicioso, es decir, perezoso.

Ejemplo:
cadena de prueba: expresión de registro codicioso de stackoverflow : salida: expresión de registro perezoso de stackoverflo w : salida: verflow de stacko
s.*o
s.*?o

Premraj avatar Jan 15 '2016 07:01 Premraj

Codicioso significa que su expresión coincidirá con un grupo tan grande como sea posible, perezoso significa que coincidirá con el grupo más pequeño posible. Para esta cadena:

abcdefghijklmc

y esta expresión:

a.*c

Una coincidencia codiciosa coincidirá con toda la cadena y una coincidencia diferida coincidirá solo con la primera abc.

Carl Norum avatar Feb 20 '2010 06:02 Carl Norum