Expresiones regulares Víctor Palomo Silva 41743 Expresiones regulares. 1. Introducción a las expresiones regulares. Las expresiones regulares son una serie de caracteres e incluso cadenas de texto que forman un patrón, normalmente representativo de otro grupo de caracteres mayor, de tal forma que podemos comparar el patrón con otro conjunto de caracteres para ver las coincidencias. Las expresiones regulares están disponibles en casi cualquier lenguaje de programación, pero aunque su sintaxis es relativamente uniforme, cada lenguaje usa su propio dialecto. Nuestro patrón puede estar formado por un conjunto de carácteres (un grupo de letras, números o signos) o por meta caracteres que representan otros carácteres, o permiten una búsqueda contextual. Los meta-caracteres reciben este nombre porque no se representan a ellos mismos, sino que son interpretados de una manera especial. He aqui la lista de meta caracteres mas usados: .*?+[](){}^$|\ 2. Su uso en la actualidad. Motores para el usuario final: Son programas que permiten realizar búsquedas sobre el contenido de un archivo o sobre un texto extraído y colocado en el programa. Están diseñados para permitir al usuario realizar búsquedas avanzadas usando este mecanismo, sin embargo es necesario aprender a redactar expresiones regulares adecuadas para poder utilizarlos eficientemente. Éstos son algunos de los programas disponibles: grep: Programa de los sistemas operativos Unix/Linux PowerGrep: versión de grep para los sistemas operativos Windows RegexBuddy: Ayuda a crear las expresiones regulares en forma interactiva y luego le permite al usuario usarlas y guardarlas. EditPad Pro: Permite realizar búsquedas con expresiones regulares sobre archivos y las muestra por medio de código de colores para facilitar su lectura y comprensión. Expresiones regulares Víctor Palomo Silva 41743 Motores para el programador: Permiten automatizar el proceso de búsqueda de modo que sea posible utilizarlo muchas veces para un propósito específico. Estas son algunas de las herramientas de programación disponibles que ofrecen motores de búsqueda con soporte a expresiones regulares: Java: Existen varias librerías hechas para java que permiten el uso de RegEx, y Sun planea dar soporte a estas desde el SDK JavaScript: A partir de la versión 1.2 (ie4+, ns4+) JavaScript tiene soporte integrado para expresiones regulares, lo que significa que las validaciones que se realizan normalmente en una página web podrían simplificarse grandemente si el programador supiera utilizar esta herramienta. Perl: Es el lenguaje que hizo crecer a las expresiones regulares en el ámbito de la programación hasta llegar a lo que son hoy en día. PCRE: Librería de ExReg para C, C++ y otros lenguajes que puedan utilizar librerías dll (Visual Basic 6 por ejemplo). PHP: Tiene dos tipos diferentes de expresiones regulares disponibles para el programador. Python: Lenguaje de "scripting" popular con soporte a Expresiones Regulares. .Net Framework: Provee un conjunto de clases mediante las cuales es posible utilizar expresiones regulares para hacer búsquedas, reemplazar cadenas y validar patrones. 3. Ejemplos prácticos. Validación de e-mails en un formulario web Hemos dicho que las expresiones regulares son uno de los instrumentos mas útiles en cualquier lenguaje de programación. ¿Para que podemos usarlas?. Uno de sus usos mas típicos es el de validar entradas de datos que los visitantes de una página puedan mandarnos a través de formularios html. El ejemplo mas corriente es el de una dirección email. Imaginemos que queremos filtrar las direcciones introducidas por los visitantes, para evitar introducir en la base de datos la típica dirección basura ghghghghghghg. Todos sabemos la estructura de una dirección email, formada por la cadena nombreusuario, el signo @ y la cadena nombredominio. Tambien sabemos que nombredominio esta formado por dos subcadenas, 'nombredomino', un '.' y un sufijo 'com', 'net', 'es' o similar. Por tanto la solución a nuestro problema es idear una expresión regular que identifique una dirección email valida típica, y confrontarla con la cadena (dirección email) pasada por el visitante por ejemplo: ^[^@ ]+@[^@ ]+.[^@ .]+$ Expresiones regulares Víctor Palomo Silva 41743 Vamos a diseccionar nuestra expresión regular: Queremos decir que el primer carácter que buscamos debe estar al principio de la cadena a comparar. [^@ ] ese primer signo no debe ser ni el signo @ ni un espacio + y se repite una o mas veces @ luego buscamos el signo @ [^@ ]+ Seguido de otro signo que no es un @ ni un espacio y se repite una o mas veces Seguido de un . (punto). [^@ .] Seguido de un carácter que no sea ni @, ni espacio ni punto +$ Que se repite una o mas veces y el último esta al final de la cadena Y para comprobarlo en la práctica, usamos una de las funciones que aportan los lenguajes de programación como php relacionadas con las expresiones regulares:ereg(). Acudiendo al manual php, podemos averiguar que esta función tiene la siguiente sintaxis: ereg (string patron, string cadenaAProcesar) Busca en string las coincidencias con la expresión regular pattern. La búsqueda diferencia entre mayúsculas y minúsculas. Devuelve un valor verdadero si se encontró alguna coincidencia, o falso in no se encontraron coincidencias u ocurrió algún error. Busquedas de textos dentro de archivos (comando grep) Su funcionalidad es la de escribir en salida estándar aquellas líneas que concuerden con un patrón. Su sintaxis es como sigue: grep [opciones] PATRÓN [ARCHIVO...] grep [opciones] [-e PATRÓN | -f ARCHIVO] [ARCHIVO...] Este comando realiza una búsqueda en los ARCHIVOs (o en la entrada estándar, si no se especifica ninguno) para encontrar líneas que concuerden con PATRÓN. Por defecto grep imprime en pantalla dichas líneas. Sus opciones más interesantes son: Expresiones regulares Víctor Palomo Silva 41743 -c: Modificar la salida normal del programa, en lugar de imprimir por salida estándar las líneas coincidentes, imprime la cantidad de líneas que coincidieron en cada archivo. -e PATRÓN: Usar PATRÓN como el patrón de búsqueda, muy útil para proteger aquellos patrones de búsqueda que comienzan con el signo «-». -f ARCHIVO: Obtenee los patrones del archivo ARCHIVO -H: Imprimir el nombre del archivo con cada coincidencia. -r: Buscar recursivamente dentro de todos los subdirectorios del directorio actual. El patrón de búsqueda normalmente es una palabra o una parte de una palabra. También se pueden utilizar expresiones regulares, para realizar búsquedas más flexibles. Algunos ejemplos simples con el comando Grez Si se quisiera buscar la ocurrencia de todas las palabras que comiencen con «a» minúscula, la ejecución del comando sería algo así: $ grep 'a*' archivo Uso de expresiones regulares para la definición de cadenas aceptadas por un analizador lexico. Jaccie es un generador de compiladotes que permite interactuar al usuario pudiendo visualizar paso a paso el procesamiento del análisis léxico, del sintáctico y de la evaluación de atributos. Está escrito en Java y genera ficheros .java, opera en las tres sucesivas fases, antes mencionadas, a partir de descripciones formales de expresiones regulares, gramáticas libres de contexto y reglas de evaluación de atributos respectivamente. Contiene un “editor especial” para producir y modificar las descripciones formales y un “entorno de depuración” para probar los componentes generados. 4. Bibliografía Apuntes y documentación de la asignatura Compiladores e Interpretes. J.A. Román http://dns.bdat.net/ (Visitada el 20/01/08) http://www.desarrolloweb.com (Visitada el 20/01/08)