18 enero 2006

Nuestras amigas, las Expresiones Regulares (II) : Perl

Una de las partes más potentes de Perl son su manejo de las expresiones regulares. De una forma potente y sencilla nos permite validar y extraer información de cadenas de texto, a costa de sacrificar un poco de legibilidad.

Si queremos comprobar si una cadena cumple con una determinada Expresión Regular no tenemos más que fijarnos en este código:

#!/usr/bin/perl
if ($variable =~ m/\d/i) {
    printf("La cadena '$variable' contiene un dígito\n");
}


Las expresiones regulares en Perl van entre /. La acción que queremos realizar sobre la RegExp va al principio y las opciones al final. La acción m es match (es la acción por defecto, no es necesario ponerla) y retorna verdadero si se produce un aparición de la expresión regular. La opción i nos sirve para indicar que la búsqueda se realiza 'case insensitive', sin importar si es mayúscula o minúscula. Este comando de Perl es un poco confuso al principio (parece una asignación, pero no lo es), pero es uno de los más prácticos.

Otra acción que podemos realiar con las expresiones regulares es la substitución (s):

#!/usr/bin/perl
$variable =~ s/\d/0/; # Reemplaza todos los digitos de $variable por 0
                                        # y lo asigna a la misma variable


Bien, ya sabemos como validar y transformar una cadena utilizando las Expresiones Regulares, pero ¿cómo extraer la información? Para ello se utilizan los parentésis durante una acción de match y posteriormente podemos acceder con $1,$2,... por cada parentesis que hayamos colocado:

#!/usr/bin/perl
$fecha = "10-01-2006";
$fecha =~ /\d\d-(\d\d)-(\d+)/;
printf("El mes es $1 y el año $2\n");


Realmente sencillo, ¿no? Si ahora queremos obtener todos los encuentros en una cadena, utilizamos la opción g para que la operación se realiza en la totalidad de la cadena, no se detenga en el primer encuentro. Por ejemplo, si queremos todos los números de una cadena:

#!/usr/bin/perl
$string ="aabb1aa2aaa3";
while($string =~ /(\d)/g) {
    printf ("Encontrado $1\n"); # Encontrará 1, 2 y 3
}


Estas son las operaciones más básicas que se pueden realizar con cadenas, pero son la base para realizar cualquier otra más compleja. Como podéis ver con operaciones muy sencillas (aunque algo crípticas, todo hay que decirlo) podemos manipular como queramos el contenido de una cadena. En el próximo post sobre RegExp explicaré como funcionan en Java.

Links
Nuestras amigas, las Expresiones Regulares(I)
Regular-Expressions.info
Regular Expressions By Example
Regular Expressions in Perl

1 comentario:

singermornings dijo...

Está mal que yo lo diga, pero tito singermornings ya llevaba razón en su insistencia de determinados desarrollos en peeeeerl. ;-)

Sobre todo para lo que se expone, tratamiento de cadenas y, en su caso, fichero de texto.

perl (still) rules!

p.s. para cuándo phython? quesque me tiene el coco comido. :-)