Este artículo puede interesarte si alguna vez te has preguntado que son y para que puedes usar las RegEx o Expresiones Regulares. Si no, léelo también, que el saber no ocupa lugar.
Pero… ¿Qué son las RegEx?
Las Expresiones Regulares, usualmente referidas como RegEx (como diminutivo de “Regular Expressions”), son secuencias de caracteres ampliamente usadas tanto en el cómputo teórico como en el uso de lenguajes de programación para realizar patrones de búsqueda en cadenas de texto.
Dicho de otra manera, son comodines usados para realizar búsquedas mediante el uso de distintos caracteres especiales, tanto de manera aislada como en agrupaciones de estos.
Este tipo de “atajos” nos permiten escribir cadenas que puedan cumplir con distintos textos, basándonos en un patrón común para estas cadenas; con esto, podremos realizar una operación de búsqueda a través de un lenguaje de programación, escribiendo una sola expresión en lugar de tener que escribir todas las combinaciones posibles.
Vamos a ilustrar esto con un ejemplo sencillo:
Supongamos que queremos mostrar todos los archivos que empiecen por la cadena “Copia” y que terminen por un número (un solo dígito), siendo los siguientes los casos posibles:
- Copia0
- Copia1
- Copia2
- Copia3
- Copia4
- Copia5
- Copia6
- Copia7
- Copia8
- Copia9
Como podemos ver, incluir todas estas opciones en el código sería algo tremendamente tedioso, y malgastaríamos tiempo y esfuerzo en algo que no aporta nada.
Gracias a las expresiones regulares, podríamos usar una expresión como la siguiente para sustituir todos los casos:
- Copia[0-9]
Y ojo, este es un ejemplo realmente sencillo, hay auténticos horrores por ahí que si no fueran tratados mediante expresiones regulares sería un infierno gestionar.
¿Dónde se usan las RegEx?
Las Expresiones Regulares son ampliamente usadas en el mundo de las tecnologías de la información, tanto en la programación como en la administración de sistemas.
Por ejemplo, cuando hablamos del desarrollo de aplicaciones, las Expresiones Regulares son el método por el que se realizan las búsquedas (tal como hemos comentado previamente) dentro de las cadenas de texto.
El programa, realmente, hace uso de un motor de búsqueda con capacidades especiales encaminadas al uso de las expresiones regulares.
Existen dos tipos de motores:
- Motores de usuario final: Permiten al usuario realizar búsquedas avanzadas sobre el contenido de un archivo o texto. Por el contrario, tienen el hándicap de necesitar que el usuario entienda como funcionan y su sintaxis. Algunos ejemplos son:
- Grep.
- Sed.
- Sublime.
- Motores de programador: Permiten que se automatice el proceso de búsqueda para un propósito específico. Algunos ejemplos de motores de programación son:
- AWK.
- Perl.
- Python.
Tal como hemos dicho, si estamos administrando sistemas, pongamos que por ejemplo un sistema GNU/Linux Debian en el que buscamos todos los archivos que empiecen por “copia”, tengan unos caracteres intermedios y sean de texto con una “.txt”, la forma de listar estos archivos sería mediante el comando:
# ls -lah copia*.txt
Siendo este un ejemplo simple de uso de una RegEx de usuario final.
Algunos usos de las RegEx:
En este punto, y a pesar de que este no es un tutorial sobre el uso de Expresiones Regulares, nos ha parecido apropiado comentar algunas de las más típicas y como son usadas en distintos entornos.
NOTA: Es importante decir que se están mostrando ejemplos simplificados, por lo que algunas de las reglas por las que se rigen estas expresiones pueden explicarse de manera parcial. Por favor, valora estos ejemplos y descripciones a modo ilustrativo, como una primera toma de contacto y no como una guía definitiva sobre su uso.
Más adelante añadiremos algún tutorial en el que se traten las RegEx con mayor profundidad dentro del blog de Jotelulu.
En este caso, vamos a tratar algunos de los elementos más ampliamente usados, empezando por los paréntesis y los corchetes. Usualmente no empezaríamos por estos símbolos, pero van a ser usados en las explicaciones posteriores, por lo que creemos que puede ser interesante sacrificar el orden que consideraríamos más ortodoxo en pro de la “legibilidad”:
- Símbolos de paréntesis “()”: Permiten agrupar distintos caracteres que serán válidos, proporcionando distintas opciones que se puedan cumplir. Un ejemplo de esto podría ser “bebe (agua|leche)” que aceptaría las frases en las que se encuentre “bebe agua” o “bebe leche”.
- Símbolos de corchetes “[]”: Los corchetes, al igual que pasa con los paréntesis, son usados para representar grupos de caracteres con los que se puede hacer match. En este caso, lo que sucede es que se definirán espacios o grupos de caracteres admisibles delimitados por un “-“ (guión). Un ejemplo de esto podría ser el que hemos puesto anteriormente, Copia[0-9] en el que serían admisibles los archivos que empiecen por “Copia” y terminen por un caracter numérico. Además, por poner otro ejemplo distinto, podemos pensar en una expresión regular que reconozca una palabra en los que se incluyan o no las tildes, como podría ser “organización” y “organización” y que se definiría con la siguiente Expresión Regular “organizaci[o-ó]n”.
- El punto “.”: Representa cualquier caracter disponible, sin distinguir mayúsculas, minúsculas, números u otros elementos, como por ejemplo los saltos de líneas que, recordemos, son caracteres con funciones especiales. En este caso, si nosotros usamos una expresión como por ejemplo “set.”, la búsqueda hará match con cualquier palabra que empiece con “set” y termine con un único caracter, incluyendo espacio, salto de línea, números, letras, etc. Por tanto, esta expresión nos servirá para casos como los siguientes:
- Seto.
- Seta.
- Set.
- …
- El asterisco “*”: Representa las opciones en las que se encuentra una serie de caracteres cero o más veces, pudiendo darse el caso de que no exista ninguna ocurrencia. Si por ejemplo se establece la RegEx “Hola[a-z]*” podremos encontrarnos con palabras como:
- Hola.
- Holaa.
- Holaaa.
- …
- El signo de suma “+”: Representa caracteres que pueden estar repetidos una o más veces, o sea, siempre con un mínimo de una vez. Si por ejemplo se establece el mismo ejemplo que en el caso anterior, con una RegEx “Hola[a-z]*”, en el que básicamente serían las mismas ocurrencias, pero quitando la posibilidad de las cero repeticiones, quedando:
- Holaa.
- Holaaa.
- …
- Signo de interrogación “?”: Este es un símbolo usado para varias tareas o funciones dentro de las RegEx. Se puede usar, por ejemplo, para validar el caracter o grupo de caracteres anteriores en cero o más ocasiones. Pudiéndose usar de una manera similar a la que usábamos en el caso del asterisco “*”. Si por ejemplo tomamos la siguiente expresión regular “h?ablando”. Esta nos mostrará tanto las ocurrencias del verbo hablar como las del verbo ablandar. El mismo ejemplo lo podríamos llevar a una expresión regular que nos pueda mostrar tanto las líneas de texto que incluyan la palabra “effects” y “efectos”, o sea, que sea capaz de hacer match con la misma palabra en inglés o en castellano. En ese caso, podremos usar la expresión regular “ef(\|fects|ectos)?”.
- Símbolo de tubería o pipeline “|”: Este símbolo permite hacer la separación de varias opciones para las que se hará match. Aunque la verdad es que la explicamos un poco tarde porque ya hemos visto su uso en varios puntos anteriores.
- Símbolo de contrabarra “\”: Este carácter es sin duda conocido por todos los administradores de UNIX y GNU/Linux. Es un caracter especial usado para “escapar” el significado del siguiente caracter. Si, por ejemplo, se usa “\t” no se interpreta como “t” sino como “Tabulador”. Y así con un largo etcétera de caracteres usados por el sistema, como, por ejemplo:
- \t: Representa un tabulador.
- \r : Retorno de carro.
- \n : Nueva línea.
- \e : Escape.
- \f : Salto de página.
- \x : Representar caracteres ASCII o ANSI.
- \u : Representar caracteres Unicode
- \d : Dígito decimal, del 0 al 9.
- …
- Símbolo de dólar “$”: Es un símbolo especial que se usa para marcar que se está hablando del final de la línea. Si por ejemplo escribimos “\.$”, estaremos haciendo referencia a que se busque las líneas que finalizan con un caracter de puntuación “.”.
- Símbolo de circunflejo “^”: Este caracter puede usarse de múltiples formas, una de ellas es la de referenciar el inicio de la línea, como por ejemplo en “\P^” que mostraría las líneas que empiezan por “P”. Pero por otro lado, también se usa para “negar”, o sea, hacer lo contrario de lo que se está mostrando en una expresión regular, en la que si tenemos “[P]” se debería hacer match con “P”, en el caso de “[P]”^indica que hace match cualquier cosa menos la “P”.
Estos no son todos los elementos ni casos que podemos encontrarnos cuando hablamos de Expresiones Regulares, pero sí que nos ayudan a sentar unas bases sobre las que trabajaremos más adelante.
Por otro lado, también hay que tener en cuenta que la potencia de las expresiones regulares no radica en su uso de manera independiente, sino todo lo contrario, lo que las hace una herramienta realmente potente es la capacidad que tienen cuando se combinan unas con otras.
Y con esto damos por terminado este capítulo sobre la introducción a las Expresiones Regulares, que podemos prometer que no será el último.
Conclusiones:
Esperamos haberte proporcionado una primera overview, o siendo menos anglicistas y más castizos, una vista de pájaro de que son y para que puedes usar las RegEx o Expresiones Regulares, que pueden permitirte hacer grandes cosas en el mundo de la administración de sistemas, bien sean estos GNU/Linux o Microsoft Windows, o en el mundo del desarrollo de aplicaciones o sistemas.
Las expresiones regulares las podemos usar por ejemplo para buscar los ficheros que cumplan con unas condiciones concretas, permitiendo borrar aquellos ficheros que tengan por ejemplo un nombre dado.
Usando combinaciones de RegEx podemos potenciar su efecto y hacer usos mucho más potentes de la herramienta en sí.
Si quieres mantenerte al día de los contenidos relacionados con las Expresiones Regulares, o con otros temas relacionados, como por ejemplo scripts y trucos para su uso con Python, PowerShell, GNU/Linux, etc. puedes echar un ojo a nuestro blog.
Asimismo, si tienes dudas contáctanos y estaremos encantados de echarte una mano.
¡Gracias por leernos!