¡Ya estamos en Twitter!

Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad

Expresiones Regulares - Intermedio

por Uriel Lizama

Introducción

Esta es la segunda parte del tutorial acerca de las expresiones regulares. Lo que vamos a ver en este tutoria es:

- Inicion y fin de la cadena
- Campo de caracteres
- Cuantificadores
- Uso de parentesis

Estoy considerando que para este momento ya leiste la primer parte de el tutorial y que ya dominas bien esa parte.

Inicio y fin de la cadena

Podemos pedir que algo aparezca en el principio de una cadena, de esta manera:

print "OK" if $campo =~ /^car/;

Esto va a dar verdadero si $campo contiene valores como "carro", "cara", "carbon", pero resultara falso para, "acarreo". Debido a que usamos el caracter ^ con lo que le decimos a perl que queremos algo al principio de la cadena.

Ahora veamos al reves, con el fin de la cadena:

print "OK" if $campo =~ /ro$/;

Podemos suponer que va a dar verdadero cuando $campo tenga los valores, "bombero", "brazero" pero falso con "roma". Pues con el caracter de $ indicamos fin de la cadena.

Estos dos siempre se pueden combinar.

Campos de caracteres

Los campos de caracteres los podemos usar cuando queremos checar que ciertos caracteres esten o no esten. La sintaxis es que todos los caracteres que queremos checar deben de estar en medio de [].

Por ejemplo, digamos que queremos checar que alguna palabra tenga cualquiera de los caracteres a,b o c:

my $palabra = "arroz";

if($palabra =~ /[abc]/){
#verdadero
}

Al correr esto vemos como va a resultar verdadero pues "arroz" contiene el caracter "a".

Ahora digamos que queremos checar que un nombre de archivo solo tenga caracteres como las letras del abecedario, números, punto y guion.

my $archivo = "nombre.txt";

if($archivo =~ /^[a-zA-Z0-9_.]+$/){
print "1";
}

Veamos parte con parte. Comenzamos con un ^ que como vimos antes indica inicio de cadena, después viene nuestro campo de caracteres, pero hay algo especial, pues podemos ver que empieza con un "a-z", aquí vemos como estamos usando un caracter especial que es el "-", con lo que le estamos diciendo a perl que queremos todos los caracteres entre "a" y "z", así que "a-z" es similar a poner "abcdefghijklmnopqrstuvwxyz". Luego hacemos lo mismo pero con mayúsculas "A-Z" y con los números "0-9". Luego indicamos que podemos aceptar el "_" y el ".". Al terminar nuestro campo usamos un cuantificador "+" que veremos más adelante. Y terminamos con el fin de cadena "$".

Debido a que como vimos el "-" es un caracter especial, si lo deseas usar como un caracter normal, debe de ser lo primero que pones en el campo de caracteres:

[-A-Z] #todas las mayusculas del abecedario y el -

Digamos ahora que queremos hacer lo contrario, checar que ciertos caracteres NO esten. Vamos a ver un ejemplo que checa que un campo NO contenga número:

my $campo = "valor";

if($campo =~ /^[^0-9]$/{
#no hay numeros
}

Vemos como usamos el caracter de ^ dentro del área de caracteres que ahora va a significar no.

Cuantificadores

Habrá veces que necesitas saber que algun elemento se encuentra dentro de una cadena cierta cantidad de veces. Es por eso que se necesitan los llamados cuantificadores.

Los cuantificadores son caracteres especiales (*,+,{m,n}) que le dira a perl la cantidad de veces que necesitamos que algo aparezca. Ahora vamos a ver un ejemplo de cada uno de los cuantificadores.

Cuantificador *

Este cuantificador se puede interpretar como algo que no puede estar o que puede estar. Este cuantificador es como un comodin y se usa en los casos en que algo puede o no puede estar.

Por ejemplo, digamos que queremos verificar un campo, pero el valor de este puede tener un espacio al principio o no:

if($campo =~ /\s*valor/){ #verdadero }

De esta manera la variable $campo puede tener los valores: "valor" o " valor" y resulta verdadero.

Cuantificador +

Con este cuantificador decimos algo que puede aparecer una o más veces. Este lo usamos cuando queremos que algo aparezca por lo menos una vez. Por ejemplo, digamos que queremos checar que un campo tenga por lo menos un caracter de número:

if($campo =~ /\d+/){ #campo contiene numero(s) }

Cuantificador {m,n}

Este cuantificador nos da mas control sobre las veces que queremos encontrar algo. m lo vamos a sustituir por el mínimo de veces que queremos que se encuentre y n el máximo.

Digamos que queremos checar que un campo tenga minimo 5 números y máximo 10, entonces podríamos hacer algo así:

if($campo =~ /\d{5,10}/){ #hay entre 5 y 10 números }

Parentesis

Los parentesis dentro de las expresiones regulares nos sirven para agrupar, aparte de que nos sirven para salvar dentro de variables las expresiones.

Veamos unos ejemplos. Digamos que tenemos la siguiente cadena con este texto:

my $clave = "Clave importante [145676]";

Digamos que queremos saber cual es el número puesto entre "[]". Para lograr esto vamos a necesitar de los parentesis:

$clave =~ m/\[(\d+)\]/;

Al correr esta expresión, el valor que sea igualado dentro de los parentesis, se guardará en una variable especial: "$1". Perl guarda el contenido que sea igualado dentro de los parentesis en las expresiones regulares, en variables especiales que van de $1,$2,$3,$4...etc. Y siempre se guardan conforme al orden de los parentesis.

De esta manera nuestro código final sería:

my $clave = "Clave importante [145676]";

$clave =~ m/\[(\d+)\]/;

print "Mi clave es: $1\n";

Veamos otro ejemplo. Digamos que queremos sacar la letra del disco duro, el directorio y el nombre de un archivo, de una cadena que contiene la ruta absoluta a un archivo en Windows.

my $ruta = "C:/Windows/Archivo/programa.exe";

Lo que buscamos es poner "C","windows/archivo" y "programa.exe" en tres variables distintas. Usando los parentesis, y todo lo que hemos aprendido anteriormente lo podemos hacer de una manera sencilla:

$ruta =~ m{
^ #inicio de cadena
([a-zA-Z]+)\:\/ #Sacamos la letra del disco
(.*)\/ #El directorio
(.*) #Nombre
$ #Fin de la cadena
}x;

No voy a dar más explicación de lo que hace la expresión regular, de hecho se los dejo de tarea, revisen parte por parte, pues todo lo que hay dentro ya fue visto en estas dos partes del tutorial. Nada más como nota, al final use el operador "/x" que permite separar la expresión en varias lineas de esa manera podemos poner comentarios. Y también esta el carácter de "." que significa cualquier cosa.

Ahora, como sabemos usamos los parentesis, por lo que tenemos ya nuestras variables $1,$2 y $3 llenas.

Así que nuestro código final quedaría:

my $ruta = "C:/Windows/Archivo/programa.exe";

$ruta =~ m{
^ #inicio de cadena
([a-zA-Z]+)\:\/ #Sacamos la letra del disco
(.*)\/ #El directorio
(.*) #Nombre
$ #Fin de la cadena
}x;

print "Disco: $1\n";
print "Directorio: $2\n";
print "Archivo: $3\n";


Notas Finales

En esta segunda parte vimos ya aspectos más avanzados de las expresiones regulares lo que nos permitirá hacer mucho mas cosas.

¿Quiéres más tutoriales como este? Escribir tutoriales toma una gran cantidad de tiempo y esfuerzo. Si este tutorial te ayudó a aprender o a solucionar algo, por favor considera dejar alguna donación en apoyo a Perl en Español.

Cliquea en el botón de abajo para dejar tu donación por medio de PayPal.

Comparte:
Categorías de Tutoriales:
En Nuestros Foros:

    Software error:

    junk after document element at line 1, column 32, byte 32 at /usr/lib64/perl5/vendor_perl/XML/Parser.pm line 187.
    

    For help, please send mail to the webmaster ([email protected]), giving this error message and the time and date of the error.

  • Entra a los foros »
Socializa:
Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Perl en Español es mantenido con Movable Type
Todo el contenido de Perl en Español está bajo una licencia CC:
Creative Commons License