Encontré este excelente tutorial sobre expresiones regulares y aunque intuitivamente entiendo lo que hacen los cuantificadores "codiciosos", "reacios" y "posesivos", parece que hay un serio vacío en mi comprensión.
Específicamente, en el siguiente ejemplo:
Enter your regex: .*foo // greedy quantifier
Enter input string to search: xfooxxxxxxfoo
I found the text "xfooxxxxxxfoo" starting at index 0 and ending at index 13.
Enter your regex: .*?foo // reluctant quantifier
Enter input string to search: xfooxxxxxxfoo
I found the text "xfoo" starting at index 0 and ending at index 4.
I found the text "xxxxxxfoo" starting at index 4 and ending at index 13.
Enter your regex: .*+foo // possessive quantifier
Enter input string to search: xfooxxxxxxfoo
No match found.
La explicación menciona comer toda la cadena de entrada, cartas sido consumidos , coincidencias de dar marcha atrás , la aparición más a la derecha de "foo" ha sido regurgitado , etc.
Desafortunadamente, a pesar de las bonitas metáforas, todavía no entiendo qué come quién ... ¿Conoces otro tutorial que explique (concisamente) cómo funcionan los motores de expresiones regulares?
Alternativamente, si alguien puede explicar en una frase algo diferente el siguiente párrafo, eso sería muy apreciado:
El primer ejemplo usa el cuantificador codicioso. * Para encontrar "cualquier cosa", cero o más veces, seguido de las letras "f" "o" "o". Debido a que el cuantificador es codicioso, la porción. * De la expresión primero se come toda la cadena de entrada. En este punto, la expresión general no puede tener éxito, porque las últimas tres letras ("f" "o" "o") ya han sido consumidas (¿ por quién? ). Entonces, el marcador retrocede lentamente (¿ de derecha a izquierda? ) Una letra a la vez hasta que se regurgita la aparición más a la derecha de "foo" ( ¿qué significa esto? ), Momento en el que la coincidencia tiene éxito y la búsqueda termina.
Sin embargo, el segundo ejemplo es reacio, por lo que comienza consumiendo (¿ por quién? ) "Nada". Debido a que "foo" no aparece al comienzo de la cadena, se ve obligado a tragar (¿ quién traga?) La primera letra (una "x"), que desencadena la primera coincidencia en 0 y 4. Nuestro arnés de prueba continúa el proceso hasta que la cadena de entrada se agote. Encuentra otro partido a las 4 y 13.
El tercer ejemplo no puede encontrar una coincidencia porque el cuantificador es posesivo. En este caso, toda la cadena de entrada es consumida por. * +, ( ¿Cómo? ) Sin dejar nada para satisfacer el "foo" al final de la expresión. Use un cuantificador posesivo para situaciones en las que desea aprovechar todo sin retroceder ( ¿qué significa retroceder? ); superará al cuantificador codicioso equivalente en los casos en que la coincidencia no se encuentre de inmediato.
*
,+
y?
son codiciosos. Mínimas cuantificadores les gusta*?
,+?
y??
son perezosos. Posesivos cuantificadores les gusta*+
,++
y?+
son pegajosos.