Herramientas de software: RegExp
Introducción
¡Hola!
Es un placer encontrarte en esta tercera sesión, confío en que te encuentres gozando de una salud envidiable, pues de ello depende tu estabilidad académica. Y entrando en materia te ofrezco la bienvenida a la sesión, espero que sea de tu agrado.
En esta sesión aprenderás sobre expresiones regulares o regex. Las expresiones regulares son una notación muy poderosa, flexible y eficiente para especificar patrones de búsqueda de texto.
Una vez que conozcas las expresiones regulares comprenderás por qué son muy valiosas para el análisis léxico en los compiladores, la búsqueda de patrones, y el procesamiento de texto. Además, podrás fácilmente diseñar patrones de búsqueda para efectuar el análisis léxico.
Las expresiones regulares fueron propuestas originalmente para describir lenguajes formales. El conocimiento sobre las expresiones regulares también puede aplicarse en otras aplicaciones como los editores de texto, editores de código y en la búsqueda y modificación de texto. El conocimiento sobre las expresiones regulares tiene también aplicación en el área de teoría de los lenguajes.
Existen muchas versiones de expresiones regulares. Las herramientas Lex/flex soportan una versión llamada expresiones regulares extendidas (ERE) POSIX. En esta parte sólo veremos esa versión de expresiones regulares de Lex/flex.
Aparte de la versión de Lex/flex, existen otras versiones muy populares tales como las llamadas expresiones regulares compatibles con Perl (PCRE) que están implementadas en numerosas aplicaciones como el editor Notepad++, servidor Apache, lenguajes script como PHP y R. La sintaxis de PCRE es mucho más poderosa y flexible que cualquiera de las versiones POSIX (BRE y ERE) y que muchas otras librerías de expresiones regulares.
Las expresiones regulares son una herramienta muy poderosa para el programador porque simplifica enormemente ciertas tareas complejas de procesamiento de texto que de otra manera requerirían de bastante código.
Sin más que agregar. ¡Te invito a proseguir con mucho ánimo!
Desarrollo del tema
Expresiones Regulares:
En 1956, el matemático Kleene ideó una notación simple para representar conjuntos regulares y la llamó expresiones regulares. Las expresiones regulares describen lenguajes y por esta razón se pueden utilizar para el análisis léxico en compiladores e intérpretes.
En 1968, Thompson describió un algoritmo para construir autómatas de estado finito a partir de expresiones regulares para implementarlo en un editor llamado qed. Tiempo después, lo implementó en las herramientas ed y grep de UNIX.
Una expresión regular o regex es una secuencia de caracteres formando un patrón que describe un conjunto de cadenas. Existen dos tipos de caracteres: metacarácter, con significado especial, y carácter regular, con un significado literal. Por ejemplo, en el regex «t∗», ′t′ es un carácter literal mientras que ‘∗′ es un metacarácter.
Existen muchas versiones de expresiones regulares. En 1986 se creó el estándar IEEE POSIX con el que se intentó estandarizarlas. El estándar POSIX destiló las versiones comunes en dos: expresiones regulares básicas (BRE) y expresiones regulares extendidas (ERE). Lex/flex soportan expresiones regulares extendidas POSIX. Enseguida describiremos esa versión.
Metacaracteres:
Los metacaracteres en una expresión regular de Lex/flex incluyen los siguientes:
. | Punto. Representa cualquier carácter excepto avance de línea. |
[] | Clase de caracteres. Representa un carácter de los que están entre ‘[‘ y ‘]’. Uno o más rangos de caracteres pueden ser indicados usando guion ‘-‘. Si el primer carácter después del ‘[’ es un guion o un ‘]’, éste es interpretado literalmente. Si es un ‘^’, el significado es cambiado a complemento de clase. Cualquier otro metacarácter es interpretado literalmente, excepto las secuencias de escape que inician con ‘\’. [a-z]{-}[jv] o [a-z]{+}[jv] Diferencia o unión. Representa la diferencia o unión entre la clase de caracteres de la izquierda y la clase de caracteres de la derecha. |
^ | Inicio de línea. Este metacarácter especifica que los patrones que siguen deben estar a inicio de línea. |
$ | Fin de línea. Este metacarácter especifica que los patrones que lo anteceden deben estar a final de línea. {m}, {m,n}, {m,} o {nombrepatron} Si contiene uno o dos valores, representa el número mínimo y máximo de coincidencias (repeticiones) del patrón previo. Si falta el número enseguida de la coma, se asume que el máximo es infinito. Si contiene un nombre, representa la expansión de un nombre de patrón. |
\ | Se utiliza para el escape de metacaracteres y como parte de secuencias de escape. Por ejemplo, \n es un avance de línea mientras que \* es el carácter literal asterisco ‘*’. |
* | Repetición de cero o más. Representa cero o más coincidencias (repeticiones) del patrón previo. |
+ | Repetición de uno o más. Representa una o más coincidencias (repeticiones) del patrón previo. |
? | Opcional. Representa cero o una coincidencia del patrón previo o que éste es opcional. |
| | Alternancia. Representa la coincidencia ya sea del anterior patrón o del siguiente. |
() | Agrupamiento. Agrupa patrones como uno solo. Es útil para patrones complejos que usan *, +, ?, y |. «a+b*c» Caracteres literales. Todos los metacaracteres excepto \ son interpretados de manera literal. |
/ | Contexto posterior. Representa una coincidencia del patrón previo pero sólo si hay una coincidencia del patrón siguiente. |
<estado> o <estado1, estado2> | Cuando se coloca al inicio de un patrón, representa que el patrón que sigue es procesado sólo cuando está activo uno de los estados iniciales dados. |
<<EOF>> | Fin de archivo. Representa la coincidencia con el fin de archivo. |
(?# comentario) | Representa un comentario al estilo Perl. |
(?a:patrón) o (?a-x:patrón) | Modificadores estilo Perl. Representan que el patrón es interpretado con el modificador a pero sin el modificador x. Los modificadores son: i para insensibilidad a mayúsculas-minúsculas, s para interpretar como si todo fuera una sola línea, y x para ignorar espacios en blanco y comentarios de C en el patrón. |
Conclusión
Las expresiones regulares son una notación originalmente creada para describir un lenguaje formal. Un lenguaje se define como un conjunto de cadenas escritas en un alfabeto dado.
Por lo tanto, las expresiones regulares se utilizan para especificar lenguajes de programación con la ayuda de herramientas de desarrollo de compiladores tales como Lex/flex.
Las expresiones regulares son una herramienta poderosa y flexible para efectuar ciertas tareas como son la búsqueda de patrones, procesamiento de texto, filtraje y validación de datos.
Las expresiones regulares son una herramienta muy valiosa para los programadores ya que ayudan a simplificar ciertas tareas complejas que de otra manera requerirían de mucho esfuerzo y código.
A pesar de lo anterior, las expresiones regulares no pueden utilizarse para cualquier tarea. Por ejemplo, una de las limitaciones de las expresiones regulares es que no pueden usarse para describir lenguajes no regulares o conjuntos no regulares de cadenas.
Existen muchísimas versiones de expresiones regulares. Flex soporta una versión de expresiones regulares llamada POSIX ERE (expresiones regulares extendidas).
Una expresión regular o patrón es una secuencia de metacaracteres y caracteres regulares.
Lex/flex soportan los metacaracteres siguientes: punto que sirve para buscar cualquier carácter excepto avance de línea, clase de caracteres que sirve para buscar cualquier carácter de una clase, diferencia y unión de clases de caracteres, agrupamiento de patrones, repetición de cero o más (cerradura de Kleene), repetición de uno o más (cerradura positiva), opcional, alternancia de patrones, escape de metacaracteres, interpretación literal de cadenas de caracteres, contexto posterior, expansión de patrones con nombre, procesamiento dependiente de estado inicial, patrón de fin de archivo, comentarios estilo Perl, modificadores estilo Perl.
Hemos llegado al final de la clase. ¡Te felicito por tu logro! En caso de dudas consulta a tu asesor. A continuación te invito a resolver y entregar en tiempo y forma la consigna incluida en esta clase.
¡Vas avanzando muy bien! Continúa con gusto y entusiasmo tu estudio. Nos leemos en la siguiente lección.