• Publicidad

Agrupación atómica en expresiones regulares

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Agrupación atómica en expresiones regulares

Notapor erv-Z » 2010-03-27 09:02 @418

Buenas, quisiera saber cómo funcionan la agrupación atómica en expresiones regulares, su sintaxis es más o menos esta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
(?>)
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Saludos.
erv-Z
Perlero nuevo
Perlero nuevo
 
Mensajes: 158
Registrado: 2009-07-25 13:00 @583

Publicidad

Re: Agrupación atómica en expresiones regulares

Notapor explorer » 2010-03-27 14:31 @646

En la documentación perldoc de Perl v5.8.8 no aparece por ninguna parte ninguna referencia a la palabra "atómica", así que no sé qué es lo que quieres decir.

Si te refieres a la expresión regular extendida (?>patrón), el documento perlre dice:

«Una subexpresión "independiente", aquella que hará coincidir una subcadena con un único patrón si está anclado en una determinada posición, y solamente se hará coincidir con esa subcadena.

Esta construcción es útil para optimizaciones de las que, de otra forma serían, coincidencias "eternas", porque nunca hará backtracking. También puede ser útil en lugares donde sea deseable la semántica "coge todo lo que puedas, y no devuelvas nada".

Esta semántica de "coge todo lo que puedas, y no devuelvas nada" es deseable en situaciones donde en un primer vistazo un simple "()*" parece la solución más correcta. Suponga que interpretamos un texto con comentarios delimitados por '#' seguidos por una cantidad, opcional, de espacio en blanco. Contrariamente a su apariencia, "#[ \t]*" no es la correcta subexpresión para la coincidencia con el delimitador comentario, porque puede "devolver" algún espacio en blanco si el resto del patrón puede capturarles. La respuesta correcta es cualquiera de estas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
    (?>#[ \t]*)         (capturar todo lo posible)

    #[ \t]*(?![ \t])    (un comentario que NO esté seguido de espacios)
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Por ejemplo, para capturar comentarios no vacíos en $1, deberíamos usar cualquiera de estas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
    / (?> \# [ \t]* ) (        .+ ) /x;

    /     \# [ \t]*   ( [^ \t] .* ) /x;
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Cuál se debe elegir depende de lo que estas expresiones reflejen mejor la especificación anterior de lo que son los comentarios.»

En resumen: hace lo mismo que los cuantificadores posesivos de las expresiones regulares extendidas de Perl v5.10.

Un ejemplo: supongamos que deseamos capturar el mayor número posible de 'a', pero, en caso de fallo del patrón, NO queremos que la expresión regular lo intenté devolviendo 'a' a una comprobación anterior.

perl -e '$x = "aaaaabcd"; $x =~ /(a+)(abcd)/; print "[$1][$2]\n"'

En este caso, el primer par de paréntesis captura, en un primer momento, todas las letras 'a' posibles, pero, al llegar a la segunda captura, ve que necesita una letra 'a', al principio. Como no la tiene (fueron capturadas todas antes), la expresión regular falla. Ahora bien, como hemos hecho una captura posesiva ('+'), Perl vuelve un paso atrás, devolviendo la última letra 'a' capturada, y volviendo a probar la expresión regular. Y ahora sí: la 'a' no capturada en el primer par de paréntesis entra en el segundo par, y dando validez a toda la expresión regular. Y el resultado es

[aaaa][abcd]

En cambio, con

perl -e '$x = "aaaaabcd"; $x =~ /((?>a+))(abcd)/; print "[$1][$2]\n"'

no obtenemos nada, indicando que la expresión regular ha fallado completamente. Y es debido a que ((?>a+)) captura todas las 'a' posibles SIN devolverlas en caso de tener que volver a atrás. Por eso, no quedan 'a' posibles para el segundo par de paréntesis.

Como he dicho antes, esto mismo se hace en Perl v5.10 con los cuantificadores posesivos:

perl -E '$x = "aaaaabcd"; $x =~ /(a++)(abcd)/; say "[$1][$2]"'
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Agrupación atómica en expresiones regulares

Notapor erv-Z » 2010-03-27 14:45 @656

Bien, ya entendí...

Saludos.
erv-Z
Perlero nuevo
Perlero nuevo
 
Mensajes: 158
Registrado: 2009-07-25 13:00 @583


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 8 invitados

cron