Hablar de “expresiones regulares” no tienen el mismo glamour que cuando se trata de las aplicaciones que trabajan con sonido, vídeo o imágenes. No obstante, esta característica presente en la base Unix del Mac OS X, en muchos editores de texto y en la mayoría de los lenguajes de desarrollo como Perl, Python, PHP o REALBasic (incluyendo en este grupo también a la programación de páginas Web) te proporcionará toda la potencia necesaria para que puedas ahorrar una buena cantidad de tiempo en multitud de operaciones que impliquen el manipulando de datos de texto o incluso si deseas gestionar tus archivos desde el Terminal.

En cualquiera de estos casos las expresiones regulares (conocidas también como expresiones Grep) te permitirán condensar, en muchas ocasiones en una única línea, las operaciones de búsqueda o búsqueda y sustitución más complejas que de otra forma requerirían varias horas de procesamiento manual o precisarían el uso consecutivo de varias operaciones de búsqueda comunes.

¿Qué es eso de las expresiones regulares?

Se trata de una sentencia de búsqueda en la que se utilizan caracteres especiales (metacaracteres), y cuyo significado no es el de la letra o signo que representan sino el equivalente a un comando. En las expresiones regulares se utilizan dichos metacaracteres, entre otros objetos, para delimitar secuencias de búsqueda y hallar los resultados correspondientes a un patrón determinado; como por ejemplo con los caracteres “*”, que significa “cualquier caracter” o “?”, que viene a significar “alguno de los caracteres”.

Define un rango de caracteres

Seguramente en muchas de tus búsquedas debas encontrar las correspondencias del texto sobre determinados caracteres. Para definir un rango de caracteres en una expresión debes utilizar la construcción formada por los dos corchetes “[]” incluyendo entre ellos los caracteres cuya correspondencia desees encontrar:

[abc] = Encontrará en el texto cualquiera de los caracteres “a”, “b” y “c”

[a-z] = Utiliza el guión para delimitar un rango de caracteres. Por ejemplo en este caso se encontrarán todos los caracteres comprendidos en el alfabeto y que estén en minúsculas, mientras que [A-Z] encontrará todos los caracteres del alfabeto que estén en mayúsculas.

[0-9] = Encontrará en el texto todos los caracteres numéricos.

También puedes combinar varias de las anteriores opciones en la misma estructura de búsqueda. Por ejemplo, [a-zA-Z0-9] encontrará todos los caracteres del alfabeto, tanto si están en mayúsculas como si están en minúsculas, así como los números del 0 al 9.

Otra opción que encontrarás muy útil para esta construcción es la que te permite excluir un grupo de caracteres de la búsqueda añadiendo el caracter “^” justo a continuación del corchete de apertura. Por ejemplo, la construcción [^aeiou] daría como resultado todos los caracteres exceptuando las vocales. Al igual que en el anterior caso, con las exclusiones también puedes combinar varios rangos de caracteres; en [^aeiou0-9] se excluirán todas las vocales y los números.

Esta construcción sólo es válida cuando el caracter “^” está situado justo a continuación del corchete de apertura; si ocupa otra posición su significado será el de otro caracter más. Por ejemplo, la expresión a[bc^] significa busca un texto cuya posición inicial esté ocupada por el caracter “a” seguido de “b”, “c” o del caracter “^”.

Guardar y recuperar valores

En la mayoría de los casos el verdadero ahorro de tiempo llega cuando se emplean expresiones regulares complejas, compuestas por la combinación de varias expresiones regulares en las que el análisis de una expresión depende del valor hallado con la expresión anterior. En otras situaciones, simplemente necesitamos saber cómo podemos acceder a un valor determinado, obtenido como resultado de aplicar nuestra expresión de búsqueda para utilizarlo en la sustitución.

Las expresiones regulares disponen de un mecanismo para guardar y recuperar valores mediante el uso de variables, aunque en algunos entornos sólo pueden manejar un máximo de nueve valores.

Para indicar que deseamos guardar el resultado de una expresión en una de estas variables sólo hay que incluir dicha expresión entre paréntesis. Por ejemplo:

([a-z])

Guardará en la primera “variable” cualquier caracter alfanumérico del texto sobre el que se aplique la búsqueda.

Para recuperar el valor se utiliza el caracter “\” (barra invertida) seguido del número correspondiente a la variable de la que deseemos recuperar el valor. En este caso el “1”, puesto que es la primera. Por tanto, con “\1” recuperaremos el valor guardado por la anterior expresión.

Un ejemplo, aunque bastante simple, de ver cómo podemos combinar dos expresiones para realizar una búsqueda y sustitución en cualquier programa que acepte el uso de expresiones regulares consiste en introducir la siguiente expresión en el campo de búsqueda para hallar en nuestros textos dos caracteres consecutivos iguales:

([a-z])\1

E introduciendo en el campo de sustitución la expresión “\1” (sin comillas) podrás sustituirlo por una única instancia de dicho caracter.

Más opciones para tus expresiones

Otros metacaracteres con los que podrás ampliar el tipo de búsquedas, por ejemplo con los “caracteres invisibles” como los espacios, tabuladores, retornos de carro, etc., y que seguramente sean los que necesites tratar con mayor frecuencia en la preparación de tus documentos (especialmente en el diseño de páginas HTML y en los documentos que vayas a importar con InDesign, QuarkXPress o en tus bases de datos):

\s = Utilízalo para encontrar cualquier posición que no se corresponda con un caracter de texto (espacios, tabuladores, retornos de carro, etc).

\S = En este caso se obtiene el resultado opuesto al anterior; encontrará cualquier caracter no incluido en “\s”.

\r = Utilízalo para hallar un retorno de carro.

\n = Este es el que representa al retorno de carro (flexible) en Unix.

\t = Utiliza este signo para encontrar un tabulador.

\w = Con este metacaracter se obtiene el mismo resultado que si se utilizase la expresión [a-zA-z0-9], además de añadir como coincidencia el caracter “_” y algunos otros de 8 bits. Con el metacaracter \W se obtiene el resultado opuesto.

\d = En este caso se hallará cualquier dígito; con los mismos resultados que si utilizases la expresión [0-9]. Con el metacaracter \D se obtiene el resultado opuesto.

Enumeraciones

Es bastante probable que en tus expresiones quieras hallar exactamente una secuencia formada por la combinación de tres letras, letras y números, etc. Para esto puedes emplear los siguientes metacaracteres:

+ o * = Indica uno o más caracteres; por ejemplo, con la expresión “a+” se buscará una o más “a” en el texto.

? = Indica cero o más caracteres; por ejemplo, con la expresión “a?” se obtendrá un resultado coincidente si en el texto no hay ninguna “a”, hay una, o si hay más de una.

{valor}; {mínimo,}; {mínimo, má