Una Brevísima Introducción a las Expresiones Regulares

Las Expresiones Regulares (abreviadas regexp) se pueden encontrar en muchos editores como vi, emacs, en programas como grep, grep y en lenguajes de programación como awk y sed. Se usan en busquedas y sustituciones avanzadas. Las Expresiones Regulares habitualmente se delimitan entre barras de división (/regexp/) pero, si se preceden de la m (de matching) pueden usarse otros delimitadores (por ejemplo m{regexp}, m#regexp#, etc.).

Resumen de las regexp mas Usadas

Las expresiones regulares son un lenguaje para la descripción de lenguajes. Una expresión regular define un lenguaje. Por ejemplo, la expresión regular /[a-z]+/ define el lenguaje formado por las cadenas que consisten en repeticiones de una o mas letras minúsculas.

La tabla 1.3 muestra algunos de los metasímbolos usados en las expresiones regulares. En http://refcards.com/docs/trusketti/perl-regexp/perl-regexp-refcard-a4.pdf puede encontrar un PDF con una hoja de referencia que resume el uso de las expresiones regulares en Perl.


Tabla: Algunos metasímbolos usados en las expresiones regulares
* El elemento precedente debe aparecer 0 o más veces.
+ El elemento precedente debe aparecer 1 o más veces.
. Un carácter cualquiera excepto salto de linea.
? Operador unario. El elemento precedente es opcional
{n} que coincida exactamente n veces
{n,} que coincida al menos n veces
{n,m} que coincida al menos n veces y no mas de m
| O uno u otro.
^ Comienzo de linea
$ Fin de linea
. Cualquier carácter que no sea el retorno de carro
[...] Conjunto de caracteres admitidos.
[^...] Conjunto de caracteres no admitidos.
- Operador de rango
(...) Agrupación.
\ Escape
\n Representación del carácter fin de linea.
\t Representación del carácter de tabulación.




Para saber más sobre expresiones regulares, estudie el capítulo 3. Por ahora nos basta saber que una expresión regular define un lenguaje. Asi la expresión regular /__END__/ define el lenguaje cuya única palabra es __END__ y la expresión regular /LHP/ define el lenguaje cuya única palabra es LHP.

El Operador de Binding

Normalmente, con las expresiones regulares se usa El operador de binding =~, el cuál nos permite ''asociar'' la variable con la operación de casamiento/sustitución sobre la expresión regular:

if ($d =~ /esto/) { print "la palabra 'esto' aparece en: $d\n" }
Si se omiten el operador =~ y la variable entonces se usa la variable por defecto $_:

pp2@nereida:~/doc/2005_2006$ perl -wde 0
main::(-e:1):   0
  DB<1> $_ = '-3.2'
  DB<2> print "yes" if /\d+\.?\d*/ # igual que $_ =~ /\d+\.?\d*/ 
yes
  DB<3> print "yes" if /^\d+\.?\d*$/ # No casa. $_ empieza por '-'
  DB<4> print "yes" if /^-?\d+\.?\d*$/
yes

Clases de Caracteres

A menudo resulta necesario comprobar si la variable contiene una cifra, una vocal, o caracteres de control particulares. Una clase de caracteres se define mediante el operador [ ]. He aquí algunas posibles construcciones:

        [aeiou]        # Cualquier vocal
        [0-9]          # Cualquier número del 0 al 9.
        [0123456789]   # Igual [0-9]
        [0-9a-z]       # Cualquier letra o cualquier numéro
        [\~\@;:\^_]    # Cualquiera de los caracteres(~,@,;,:^,_)

Se puede definir una clase de caracteres valiéndose de la complementaria mediante el uso del circumflejo "^":

        [^0-9]         # Carácter que no sea un dígito

Perl introduce algunas abreviaturas usadas para algunas de las clases mas comunes:


Tabla 1.4: Abreviaturas para clases expreg
Código Significado
\d [0-9] dígitos del 0 al 9
\D [^0-9] carácter que no sea un dígito
\w [a-zA-Z0-9_] carácter alfanumérico
\W [^a-zA-Z0-9_] carácter no alfanumérico
\s [ \t\n\r\f] espacio en blanco
\S [^ \t\n\r\f] carácter que no es un espacio en blanco


Paréntesis con memoria

Después de una operación de matching lo que casó con el primer paréntesis se conserva en la variable $1, lo que casó con el segundo en $2, etc.

Véase el siguiente ejemplo en el que se imprime lo que casó con los paréntesis décimo, undécimo, etc.:

lusasoft@LusaSoft:~$ perl -wde 0
main::(-e:1):   0
  DB<1> $x = "hello world!\n"
  DB<2> $x =~ /(h)(e)(l)(l)(o)( )(w)(o)(r)(l)(d)(!)(\n)/; print "$10 $11 $12 $13"
l d !



Subsecciones
Casiano Rodríguez León
2009-10-04