[Programación] Re: [Programación] Expreciones regulare s III (con que "machea")

Nicolás Aimetti programacion@lugro.org.ar
Tue, 23 Aug 2005 20:17:08 -0300


Suponiendo que se trate de una expresión regular (expre) en perl (el \S 
hace que supongamos eso, aunque no estaría mal aclarar un poco) la 
expresión

(\S+) \((^[()])*)\)

es incorrecta por el simple hecho de que el cuarto paréntesis derecho 
')' no cierra con ningún izquierdo (tal como lo dice el interprete de perl).
Olvidándonos de eso y concentrándonos en la expresión

(^[()]*) #expresión distinta a la de arriba, valga notar... quizás se deba a un error de tipeado


¿Que va a machear está expresión? absolutamente todo.
¿Por que? Sencillo, está expresión machea toda cadena que empieza (el 
símbolo ^ identifica al principio de la cadena)  con ninguno o más (la 
estrella de kleen '*' se interpreta de esta forma) caracteres incluidos 
en el conjunto {'(',')'} (esto sería [()], dentro de los corchetes el 
paréntesis pierde su significado, es solo un carácter más). De aquí 
podemos sacar dos conclusiones: Machea todo, pues toda cadena se puede 
pensar como que posee al vacío si se quiere( o el carácter nulo, o 
lambda) y por tanto puede empezar con este. Esto se debe a que la 
estrella de kleen machea la cadena vacía en si misma, o si se quiere, el 
autómata comienza en estado de aceptación. Además las expresiones 
regulares de perl buscan alguna coincidencia en TODA la cadena, si 
queremos que la cadena en en si machee la expre debemos hacer algo así: 
/^expre$/.
La segunda pregunta: ¿Que cuernos guarda $2? Que en este caso en 
realidad sería $1, pues estamos trabajando solo con (^[()]*). En $1 
queda cualquier cadena que empiece con
un carácter perteneciente al conjunto {'('.')'} y que este constituida 
únicamente por caracteres pertenecientes al conjunto mencionado, o bien 
la cadena vacía.
¿ hay otra forma mas simple de verla...? Se podría dibujar el autómata, 
pero no vale la pena.

Para probar esto se puede ejecutar este script:
#!/usr/bin/perl
# file: foo.pl
while(<>){
        print "machea,y \$1 es: <$1>\n" if( /(^[()]*)/ );
}

al ejecutarlo:

nick@~/code/perl:)$ ./foo.pl
hola
machea,y $1 es: <>
()hola
machea,y $1 es: <()>

machea,y $1 es: <>
()())))((hola))
machea,y $1 es: <()())))((>
                          
Saludos,
              Nicolás.

Horacio Castellini wrote:

>Holas.
>	No me queda clara con que expresión regular coincide ("machea según 
>barbarismo en boga) esta expresión regular
>
>(\S+) \((^[()])*)\)
>
>Que cuernos guarda $2??? es decir como actúa "(^[()]*)" ?? hay otra forma mas 
>simple de verla...?
>
>Saludos Gracias...
>
>
>  
>