¿Qué significan "vago" y "codicioso" en el contexto de las expresiones regulares?
¿Cuáles son estos dos términos de una manera comprensible?
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.
'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.+l
coinciden 'hell'
pero 'hello'
los perezosos h.+?l
coinciden 'hel'
.
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
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
.