validator regular online one regex perl pcre

regular - regex one



Verbos que actĂșan despuĂ©s del retroceso y falla (1)

Antes de leer esta respuesta, debe estar familiarizado con el mecanismo de retroceso, grupos atómicos y cuantificadores posesivos. Puede encontrar información sobre estas nociones y características en el libro de Friedl y siguiendo estos enlaces: www.regular-expressions.info , www.rexegg.com

Toda la prueba se ha realizado con una búsqueda global (con la función preg_match_all() ).

(*FALLAR)

baabo caaco daado caac(*FAIL)|aa.|caaco|co [0] => aab [1] => caaco [2] => aad

(*FAIL) causa exactamente el mismo comportamiento que un "mal carácter" en un patrón. Si lo reemplaza por una "R" obtiene exactamente el mismo resultado: caacR|aa.|caaco|co . Para ser más general, puedes reemplazar (*FAIL) por un "subpatrón siempre defectuoso" como: (?!) , (?=a(?<!a)) ...

a (first from "baabo") : sin sorpresa, el primer resultado se encuentra en la segunda alternativa. ( aab )

c (first) : el motor de expresiones regulares encuentra la primera "c" y prueba la primera alternativa y busca: caac , pero el subpatrón se ve obligado a fallar. Luego, el motor de expresiones regulares (siempre desde la primera "c") prueba la segunda alternativa que falla, la tercera alternativa tiene éxito. ( caaco )

a (first from "daado") : el tercer resultado se encuentra con la segunda alternativa. ( aad )

(*OMITIR)

baabo caaco daado caa(*SKIP)c(*FAIL)|aa.|caaco|co [0] => aab [1] => co [2] => aad

Este verbo define un punto más allá del cual el motor de expresiones regulares no puede retroceder cuando el subconjunto falla más tarde. Consecuencia, todos los caracteres encontrados antes con el subpatrón se consumen, de una vez por todas , y no se pueden usar para otra parte del patrón (alternativa).

a (first from "baabo") : el primer resultado se encuentra en la segunda alternativa. ( aab )

c (first) : el motor de caac regulares encuentra caac como en el primer caso, luego falla (causa del verbo (*FAIL) ), retrocede a la segunda "c", pero no puede retroceder a los caracteres que están previamente coincidentes (" caa ") antes del verbo (*SKIP) .
c (second) : Ahora, el motor de expresiones regulares intenta siempre la primera alternativa pero en esta nueva posición y falla ya que hay una "o" y no una "a" después, entonces retrocede a esta segunda "c". Tenga en cuenta que en este caso, estos caracteres no se consumen como anteriormente porque el subpatrón no ha llegado antes al alcanzar el verbo (*SKIP) . La segunda alternativa se prueba y falla (no comienza con una "c"). La tercera alternativa falla también porque el siguiente carácter es una "o" y no una "a". La cuarta alternativa tiene éxito y da el segundo resultado. ( co )

a (first from "daado") : el tercer resultado se encuentra con la segunda alternativa. ( aad )

(*CIRUELA PASA)

baabo caaco daado caa(*PRUNE)c(*FAIL)|aa.|caaco|co [0] => aab [1] => aac [2] => aad

Este verbo es diferente de (*SKIP) porque no prohíbe utilizar todos los caracteres coincidentes anteriores, pero omite el primer carácter coincidente por el subpatrón (o prohíbe un subpatrón para empezar) si el subpatrón fallará más tarde.

a (first from "baabo") : el primer resultado se encuentra en la segunda alternativa. ( aab )

c (first) : el motor de caac regulares encuentra caac como en el primer caso, luego falla, pero ahora retrocede a la primera "a" desde "caaco" ya que se omite la primera "c".
a (first from "caaco") : la primera alternativa se prueba y falla, la segunda tiene éxito y da el segundo resultado. ( aac )

a (first from "daado") : el tercer resultado se encuentra con la segunda alternativa. ( aad )

Hace poco estuve leyendo en la documentación PCRE - (expresiones regulares compatibles con Perl) y encontré algunos trucos interesantes con expresiones regulares. Mientras continuaba leyendo y agotando, me detuve debido a cierta confusión en relación con el uso de algunos de los patrones (*...) .

Mi pregunta y confusión se relacionan con (*PRUNE) y (*FAIL)

Ahora como referencia (*SKIP) actúa como (*PRUNE) , excepto que si el patrón no está anclado, el avance bumpalong no es para el siguiente carácter, sino para la posición en el sujeto donde se encontró (*SKIP) .

La documentación indica que (*PRUNE) hace que la coincidencia falle en la posición de inicio actual en el sujeto si el resto del patrón no coincide. Y afirma (*FAIL) también con la afirmación negativa (?!) . Fuerza una falla coincidente en la posición dada en el patrón.

Entonces, básicamente (*FAIL) comporta como una aserción negativa fallida y es un sinónimo de (?!)

Y (*PRUNE) hace que la coincidencia falle en la posición de inicio actual en el sujeto si hay una falla de coincidencia posterior que hace que el seguimiento retroceda para alcanzarla.

¿En qué se diferencian cuando se trata de un punto de falla?

¿Alguien puede dar ejemplos de cómo estos se implementan y se usan correctamente?