Introducción a las expresiones regulares
Las expresiones regulares son un sistema cómodo, rápido y potente (una vez se domina) de realizar un filtrado sobre un determinado caso, y obtener un grupo más reducido y específico, excluyendo los resultados que no coincidan con el patrón dado.
Siendo más técnicos, con ayuda de un modelo matemático, llamado DFA (Autómata Finito Determinista) se puede observar como se aceptarían las cadenas que casaran con la expresión regular equivalente abc*.
Partiendo del estado de arranque q0, podemos transitar al estado q1 con el símbolo a y transitar al estado q2 con el símbolo b para llegar a un estado de aceptación (doble trazo) e incluso seguir transitando indefinidamente con el simbolo c, lo que demostraría que las cadena ab, abc, abcc... entrarían dentro de las cadenas que acepta.
Ejemplo práctico
Para comprender esta definición, pondremos un ejemplo.
Tenemos varias carpetas, con miles y miles de imagenes con distintos nombres y formatos (JPG, PNG, GIF...) y nos interesa separar todas las fotografías en las que aparece Ramón (ramon_borracho.jpg, ramon45.jpg, ramon_de_viaje.bmp...).
La primera opción que se nos ocurre es hacerlo de forma manual, cosa que nos consumiría demasiado tiempo si se trata de más de, por ejemplo, 5.000 fotografías.
La siguiente opción es utilizar los comodines (wildcards): Utilizando los comodines * (cualquier conjunto de carácteres) y ? (cualquier carácter, sólo uno), podemos obtener más precisión de una forma sencilla: ramon*.jpg, ramon*.???, *ramon*.*, ...). En estos casos, la potencia de los comodines suele ser suficiente.
Sin embargo, el método anterior es limitado, puesto que, si quisieramos detectar fotografías con nombres como ramón.jpg, r4m0n.jpg, raaamoncito.jpeg pero no incluir román.jpg, romén.jpg y sólo incluir imagenes con formato jpg no habría forma de discriminar entre ambas opciones, salvo utilizando una expresión regular: ^.*ra|4m(o|0|ó)n.*\.jpg$.
Expresiones regulares (metacarácteres)
Ahora la pregunta es... ¿y qué significa ese conjunto de letras sin sentido? Tiene una sencilla explicación:
- El carácter ^ indica el comienzo de la cadena. Dentro de una clase indica inexistencia.
- El carácter . es un comodín (cualquier carácter, como ? en wildcards).
- El carácter * se refiere al carácter (o agrupación) anterior, puede aparecer 0 ó más veces.
- El carácter + es idéntico al anterior, pero apareciendo 1 ó más veces. Es equivalente a xx*, donde x es el carácter a repetir.
- Los corchetes [] agrupan carácteres en clases, lo que indica posibilidad.
- El carácter | indica una alternativa, o lo que está a su izquierda, o lo que está a su derecha.
- Los paréntesis () realizan una agrupación, generalmente para realizar subexpresiones más complejas, utilizar un carácter especial sobre toda la agrupación o realizar almacenamiento de información para procesado posterior.
- El carácter \ se utiliza para escapar, o lo que es lo mismo, quitarle el significado especial a un carácter, \* significa asterisco. Además, también tiene muchas opciones para detectar la naturaleza de un conjunto de carácteres (alfabéticos, alfanuméricos, dígitos, espacios en blanco, ...).
- El carácter ? que indica opcionalidad, puede o no aparecer el carácter predecesor.
- Las llaves {num} indican que el carácter predecesor aparece num veces.
- El carácter $ indica el final de la cadena.
Utilidad y aplicación
Como hemos visto anteriormente, la potencia de las expresiones regulares es increíblemente amplia. Suele ser especialmente útil para los programadores (PHP, Perl, Java, .NET...), que pueden desarrollar y reconocer patrones complejos de una forma sencilla.
Pero eso no queda ahí, si no eres programador también puedes hacer uso de las expresiones regulares para múltitud de tareas. Muchas aplicaciones utilizan expresiones regulares y seguro que no tenías ni idea:
- Bloc de notas: Aunque no el base de Windows, sino notepad2. Especialmente útil para reemplazar cadenas en textos en los que están repetidos varias veces (ficheros HTML, de texto, ...).
- Comandos UNIX: Comandos de administrador de sistemas como grep, egrep, awk, sed y tantos otros. Recuerda que si usas Windows, puedes utilizar muchos de estos comandos con UNIXUtils.
- Renombrado masivo: Como en el ejemplo que utilicé, existen multitud de programas para renombrar ficheros utilizando expresiones regulares como RegEx Renamer.
- Emule: El mismísimo emule permite realizar busquedas con un grupo reducido de expresiones regulares, por ejemplo si queremos buscar canciones que empiecen por Spectrum (para buscar de este grupo musical), podemos escribir ^Spectrum y especificar ficheros de audio, evitando asi canciones que tengan el nombre Spectrum en su título. Además en Preferencias / Opciones adicionales / Mostrar más controles (Controles de modo avanzado) puedes activar las expresiones regulares para filtrar categorías en las pestañas de tráfico.
- Renombrado de MP3: Con Quick File Rename, se mezcla la potencia de las expresiones regulares a la capacidad de utilizar los tag ID3 para renombrar tus archivos.