Dado que en los posts anteriores sobre analizadores léxicos hemos utilizado en amplitud el concepto de expresiones regulares pero sin haber dado una base sólida para ello, dedico este post a ese pequeño dolor de cabeza que representan las expresiones regulares para muchos con la intención de aliviar la confusión que representan en muchos casos.

Para comenzar hay que definir una expresión regular. Las expresiones regulares son un conjunto de patrones agrupados en una cadena de texto útiles para buscar y encontrar dichos patrones de caracteres en una secuencia mas larga. Aun cuando nunca hayas escuchado el término, seguro que si las has usado.

Las expresiones regulares están presentes en varios contextos además de los compiladores. Pongamos como ejemplo que queremos buscar todos los archivos con extensión .txt dentro de un directorio, simplemente escribimos en el buscador (input de texto usualmente en la esquina superior derecha con una lupa) la secuencia: *.txt y como por arte de magia aparecen todos los archivos cuyo nombre cumple con el patrón.

Todas las expresiones regulares están compuestas por dos tipos de caracteres:

  • Metacaracteres
  • Literales

Los metacaracteres sirven para representar un patron que se repite dentro de la secuencia que estamos analizando. Se representan por medio de una sintaxis que es en la mayor parte de los casos estándar, pero dependiendo del programa que las interpreta podrían variar. Los metacaracteres estándar son los siguientes:

MetacaracterNombreDescripcion
.puntocualquier caracter
[…]clase de caráctercualquier carácter listado entre los corchetes
[^…]clase negadacualquier carácter que no este en la lista
^IntercalaciónPosición en la que comienza la linea
$DolarPosición al final de la linea
\<backslash menor quePosición al comienzo de la palabra
\>backslash mayor quePosición al final de la palabra
|o o barrasepara dos expresiones y resulta positivo si cualquiera de las dos cumple la expresión
!negaciónindica que la expresión siguiente podría no aparecer.
?uno o masindica que la expresión siguiente podría aparecer al menos una vez
()ParentesisAgrupa sub-expresiones para ser evaluadas de forma independiente como elementos de una expresión lógica.

Así mismo los literales, son patrones que tienen que igualar una cadena de texto exacta. Veamos un ejemplo de una expresión regular que utiliza ambos elementos.

Digamos que queremos una expresión regular para buscar textos que representan horas dentro de un texto mas grande. Ponemos:

![0-9]?[0-9]:[0-9][0-9] (am|pm)$

Si volvemos a la tabla de metacaracteres podemos ver que la expresión se compone de varios de los elementos que ahi describimos. Y ademas de 3 literales que son: “:”, “am” y “pm”.

Entonces si utilizamos la siguiente cadena de texto:

Justo ahora son las 3:39 pm

La expresion regular iguala la hora en la oración y la devuelve en un arreglo:

Justo ahora son las 3:39 pm

si desglosamos todas las palabras en una tabla de símbolos:

grupoexpresión
Justo ahora son lasninguna expresión en la regla
3![0-9]?[0-9] (puede o no venir un numero seguido de al menos un numero un numero)
:el literal “:”
39[0-9][0-9] dos dígitos
literal de un espacio
pm(am|pm)$ literal am o pm seguido del final de la linea

Todos los lenguajes reconocen los corchetes como un arreglo de caracteres en un orden secuencial lógico, es decir, que 0-9 son los números del 0 al 9, a-z son los caracteres en minúscula de la a la z, y A-Z son los caracteres en mayúscula de la A-Z.

Así también si queremos solo números del 0 al 5 seria [0-5].

Jugando entonces con metacaracteres y literales podemos encontrar patrones en un texto mas grande e igualarlos con una expresión regular para luego agruparlos y hacer algo importante con esa información.

Existen también varias herramientas en linea para probar y construir expresiones regulares exitosamente, aqui listo algunas:

  1. https://regex101.com/
  2. http://regexr.com/
  3. http://www.regextester.com/
  4. http://www.regexpal.com/

Adicionalmente tambien esta el libro de “mastering regular expressions” de Jeffrey E.F Friedl el cual les recomiendo obtener a manera de referencia.

Categorized in: