Expresiones Regulares – 04

Con los metacaracteres que hemos aprendido hasta el momento, es posible efectuar múltiples tipos de búsquedas y validaciones como ya hemos visto en los ejemplos de las entregas anteriores. Sin embargo, los metacaracteres que veremos en esta entrega son los que probablemente aportan más flexibilidad y funcionalidad a las expresiones regulares: Los caracteres de repetición.

Las llaves "{}"

Comúnmente las llaves son caracteres literales cuando se utilizan por separado en una expresión regular. Para que adquieran su función de metacaracteres es necesario que encierren uno o varios números separados por coma y que estén colocados a la derecha de otra expresión regular de la siguiente forma: "\d{2}" Esta expresión le dice al motor de búsqueda que encuentre dos dígitos contiguos. Utilizando esta formula podríamos convertir el ejemplo "^\d\d/\d\d/\d\d\d\d$" que nos servía para validar un formato de fecha en "^\d{2}/\d{2}/\d{4}$" para una mayor claridad en la lectura de la expresión.

Aunque esta forma de encontrar elementos repetidos es muy útil, algunas veces no sabemos cuantas veces se repite lo que búscamos o su grado de repetición es variable. En estos casos los siguientes metacaracteres no son útiles.

El asterisco "*"

El asterisco nos sirve para encontrar algo que se encuentra repetido 0 o más veces. Osea, utilizando la expresión "[a-zA-Z]\d*" nos servirá para encontrar tanto "H" como "H1", "H01", "H100" y "H1000", osea, una letra seguida de un número indefinido de caractéres. Es necesario tener cuidado con el comportamiento del asterisco, ya que este por defecto trata de encontrar la mayor cantidad posible de caracteres que correspondan con el patrón que buscamos. De esta forma si utilizamos "\(.*\)" para encontrar cualquier cosa que se encuentre entre paréntesis y lo aplicamos sobre el texto "Ver (Fig. 1) y (Fig. 2)" esperaríamos que el motor de búsqueda encuentre los textos "(Fig. 1)" y "(Fig. 2)", sin embargo nos sorprenderemos al ver que en su lugar encontrará el texto "(Fig. 1) y (Fig. 2)". Esto sucede porque el asterísco le dice al motor de búsqueda que llene todos los espacios posibles entre dos paréntesis, y ese es el resultado que obtenemos. Si queremos obtener el resultado deseado debemos utilizar el asterisco en conjunto con el signo de pregunta de la siguiente forma: "\(.*?\)" Esto es equivalente a decirle al motor de búsqueda "Encuentre un paréntesis de apertura y luego encuentre cualquier caracter repetido hasta que encuentre un paréntesis de cierre".

El signo de suma "+"

Nos sirve para encontrar algo que se encuentre repetido 1 o más veces. A diferencia del asterisco, la expresión "[a-zA-Z]\d+" encontrará "H1" pero no encontrará "H". También es posible utilizar este metacaracter en conjunto con el signo de pregunta para limitar hasta donde queremos que se efecúe la repetición.

En la entrega anterior hablamos de que los paréntesis redondos establecen un "punto de referencia" para el motor de búsqueda. Estos puntos se denominan grupos y pueden ser anónimos o nominales. A continuación veremos en detalle como utilizar los grupos.

Grupos anónimos

Los grupos anónimos se establecen cada vez que encerramos una expresión regular en paréntesis redondos, por lo que la expresión "<([a-zA-Z]\w*?)>" define un grupo anónimo que tendrá como resultado que el motor de búsqueda almacenará una referencia al texto que coresponda a la expresión encerrada entre los paréntesis.

Pero como podemos utilizar los grupos que establecemos? La forma más inmediata de utilizar los grupos es dentro de la misma expresión regular, lo cual se realiza utilizando la barra inversa "\" seguida del número del grupo al que queremos hacer referencia de la siguiente forma: "<([a-zA-Z]\w*?)>.*?</\1>" Esta expresión regular nos ayudará a encontrar tanto "<font>Esta</font>" como "<B>prueba</B>" en el texto "<font>Esta</font> es una <B>prueba</B>" a pesar de que la expresión no contiene los literales "font" y "B".

Otra forma de utilizar los grupos es en el lenguaje de programación que estemos utilizando. cada lenguaje tiene una forma de distinta de acceder a los grupos, pero como explicamos al principio de la serie explicaremos con detalle la forma utilizada por el .Net Framework, usando la sintáxis de C# (la cual puede facilmente adaptarse a VB.Net o cualquier otro lenguaje del Framework).

Para utilizar el motor de búsqueda del .Net Framework es necesario en primer lugar hacer referencia al espacio de nombres System.Text.RegularExpressions. Luego es necesario declarar una instancia de la clase Regex de la siguiente forma:

Regex _TagParser = new Regex("<([a-zA-Z]\w*?)>");

Luego asumiendo que el texto que queremos examinar con la expresión regular se encuentra en la variable "sText" podemos recorrer todas las instancias encontradas de la siguiente forma:

foreach(Match CurrentMatch in _TagParser.Matches(sText)){
   // —– Código extra aquí —–
}

Luego podemos utilizar la propiedad Groups de la clase Match para traer el resultado de la búsqueda:

foreach(Match CurrentMatch in _TagParser.Matches(sText)){
  String sTagName = CurrentMatch.Groups[1].Value;
}

Grupos nominales

Los grupos nominales son aquellos a los que les asignamos un nombre, dentro de la expresión regular para poder utilizarlos posteriormente. Esto se hace de forma diferente en los distintos motores de búsqueda, así que una vez más aqui explicaremos como hacerlo en el motor del .Net Framework.

Utilizando el ejemplo anterior podemos convertir "<([a-zA-Z]\w*?)>" en "<(?<TagName>[a-zA-Z]\w*?)>". Nótese el signo de pregunta y el texto "TagName" encerrado entre parentesis triangulares, seguido de este. Para utilizar este ejemplo en el .Net Framework utilizaríamos el siguiente código:

Regex _TagParser = new Regex("<(?<TagName>[a-zA-Z]\w*?)>");
foreach(Match CurrentMatch in _TagParser.Matches(sText)){
  String sTagName = CurrentMatch.Groups["TagName"].Value;
}

Es posible definir tantos grupos como sea necesario, de esta forma podemos hacer algo como: "<(?<TagName>[a-zA-Z]\w*?) ?(?<Attributes>.*?)>" para encontrar no solo el nombre del tag HTML sino tambien sus atributos de la siguiente forma:

Regex _TagParser = new Regex("<(?<TagName>[a-zA-Z]\w*?) ?(?<Attributes>.*?)>");
foreach(Match CurrentMatch in _TagParser.Matches(sText)){
  String sTagName = CurrentMatch.Groups["TagName"].Value;
  String sAttributes = CurrentMatch.Groups["Attributes"].Value;
}

Pero podemos ir mucho más allá:
"<?(?<TagName>[a-zA-Z][\w\r\n]*?) ?(?:(?<Attribute>[\w-\r\n]*?)=’?"?(?<Value>[\w-:;,\./= \r\n]*?)’?"? ?)>"
Esta expresión nos permite encontrar el nombre del tag, el nombre del atributo y su valor.

Sin embargo, una tag html puede tener más de un atributo. Este caso lo resolveríamos utilizando repetición de la siguiente forma:
"<?(?<TagName>[a-zA-Z][\w\r\n]*?) ?(?:(?<Attribute>[\w-\r\n]*?)=’?"?(?<Value>[\w-:;,\./= \r\n]*?)’?"? ?)*?>"

Y en el código la utilizariamos de la siguiente forma:

Regex _TagParser = new Regex("<?(?<TagName>[a-zA-Z][\w\r\n]*?) ?(?:(?<Attribute>[\w-\r\n]*?)=’?"?(?<Value>[\w-:;,\./= \r\n]*?)’?"? ?)*?>");
foreach(Match CurrentMatch in _TagParser.Matches(sText)){
  String sTagName = CurrentMatch.Groups["TagName"].Value;
  foreach(Capture CurrentCapture in CurrentMatch.Groups["Attribute"].Captures){
    AttributesCollection.Add(CurrentCapture.Value)
  }
  foreach(Capture CurrentCapture in CurrentMatch.Groups["value"].Captures){
    ValuesCollection.Add(CurrentCapture.Value)
  }
}

Aún más podríamos profundizar utilizando una expresión como esta:
"<?(?<TagName>[a-zA-Z][\w\r\n]*?) ?(?:(?<Attribute>[\w-\r\n]*?)=’?"?(?<Value>[\w-:;,\./= \r\n]*?)’?"? ?)*?>(?<Content>.*?)</\1>"

La cual nos permitiría encontrar el tag, sus atributos, valores y el contenido de esta, y todo con una sola expresión regular!!!!

Espero que les haya gustado esta cuarta entrega. En la próxima continuaremos estudiendo ejemplos y aplicaciones de las expresiones regulares en casos específicos.

No duden en enviarme sus dudas y comentarios al respecto, estaré dispuesto a ampliar la información dada según sea requerido.

Anuncios

Expresiones Regulares – 03

En la segunda entrega de la serie iniciamos la lista de los caracteres especiales o "metacaracteres"; en esta entrega ampliaremos esta lista.

Los paréntesis cuadrados "[]"

La función de los paréntesis cuadrados en el lenguaje de las expresiones regulares es representar "clases de caracteres", osea, agrupar caracteres en grupos o clases. Son útiles cuando necesitamos buscar uno de un grupo de caracteres. Dentro de los paréntesis cuadrados es posible utilizar el guión "-" para especificar rangos de caracteres. Adicionalmente, los metacracteres pierden su significado y se convierten en literales cuando se encuentran dentro de los parentesis cuadrados. Por ejemplo, como vimos en la entrega anterior "\d" nos es útil para buscar cualquier caracter que represente un dígito. Sin embargo esta denominación no incluye el punto "." que divide la parte decimal de un número. Para buscar cualquier caracter que representa un dígito o un punto podemos utilizar la expresión regular "[\d.]". Como dijimos, dentro de los paréntesis cuadrados, el punto representa un caracter literal y no un metacaracter, por lo que no es necesario antecederlo con la barra inversa. El único caracter que es necesario anteceder con la barra inversa dentro de los parentesis cuadrados es la propia barra inversa. La expresión regular "[\dA-Fa-f]" nos permite encontrar dígitos hexadecimales. Los paréntesis cuadrados nos permiten también encontrar palabras aún si están escritas de forma errónea, por ejemplo, la expresión regular "expresi[oó]n" nos permite encontrar en un texto al palabra "expresión" aunque se haya escrito con o son acento. Es necesario aclarar que sin importar cuantos caracteres se introduzcan dentro del grupo por medio de los paréntesis cuadrados, el grupo solo le dice al motor de base de búsqueda que encuentre un solo caracter, osea, que "expresi[oó]n" no encontrará "expresioon" o "expresioón".

La barra "|"

Nos sirve para indicar una de varias opciones. Por ejemplo, la expresión regular "a|e" encontrará cualquier "a" o "e" dentro del texto. La expresión regular "este|oeste|norte|sur" nos permitirá encontrar cualquiera de los nombres de los puntos cardinales. La barra se utiliza comúnmente en conjunto con otros caracteres especiales como veremos más adelante.

El signo de dólar "$"

Representa el final de la cadena de caracteres o el final de la linea, si estamos utilizando el modo multi-linea. No representa un caractér en especial sino una posición. Si utilizamos la expresión regular "\.$" encontraremos todos los lugares donde un punto finalize la linea, lo que es útil para avanzar entre párrafos.

El acento circunflexo "^"

Este caractér tiene una doble funcionalidad, que difiere cuando se utiliza individualmente y cuando se utiliza en conjunto con otros caractéres especiales. Vamos a comentar en primer lugar su funcionalidad como caracter individual.
De manera similar que el signo de dólar "$" este caracter representa el inicio de la cadena, de forma que si utilizamos la expresión regular "^[a-z]" nos permitirá encontrar todos los párrafos que den inicio sin utilizar la letra mayúscula.
Cuando se utiliza en conjunto con los paréntesis cuadrados de la siguiente forma "[^\w ]" nos permite encontrar cualquier caracter que NO se encuentre dentro del grupo indicado. La expresión indicada nos permite encontrar, por ejemplo, cualquier caracter que no sea alfanumérico o un espacio, osea, busca todos los símbolos de puntuación y demás caracteres especiales.
La utilización en conjunto de los caracteres especiales "^" y "$" nos permite realizar validaciones en forma sencilla. Por ejemplo "^\d$" nos permite asegurarnos de que al cadena que deseamos verificar representa un único dígito, "^\d\d/\d\d/\d\d\d\d$" nos permite validar una fecha en formato corto, aunque no nos permite verificar si es una fecha válida, ya que 99/99/9999 también calza en este formato; esta validación también puede realizarse, como veremos más adelante.

Los paréntesis redondos "()"

De forma similar que los paréntesis cuadrados, los paréntesis redondos nos sirven para agrupar caracteres, sin embargo existen varias diferencias fundamentales entre los grupos establecidos por medio de parentesis cuadrados y los grupos establecidos por paréntesis redondos:

  • Los caracteres especiales conservan su significado dentro de los paréntesis redondos.
  • Los grupos establecidos con paréntesis redondos establecen una "etiqueta" o "punto de referencia" para el motor de búsqueda que puede ser utilizada posteriormente como veremos más adelante.
  • Utilizado en conjunto con la barra "|" nos permite hacer búsquedas opcionales. Por ejemplo la expresión regular "al (este|oeste|norte|sur) de" nos permite buscar textos que nos den indicaiones por medio de puntos cardinales, mientras que la expresión regular "este|oeste|norte|sur" encontraría "este" en la palabra "esteban".
  • Utilizado en conjunto con otros caracteres especiales de los que hablaremos posteriormente, permite obtener funcionalidad adicional.

El signo de pregunta "?"

El signo de pregunta tiene varias funciones dentro del lenguaje de las expresiones regulares. La primera de ellas es especificar que una parte de la búsqueda es opcional. Por ejemplo, la expresión regular "ob?scuridad" nos permite encontrar tanto "oscuridad" como "obscuridad". En conjunto con los parentesis redondos nos permite especificar que un conjunto mayor de caracteres es opcional; por ejemplo "Nov(\.|iembre|ember)?" nos permite encontrar tanto "Nov" como "Nov.", "Noviembre" y "November".
Como dijimos anteriormente los paréntesis redondos nos permiten establecer un "punto de referencia" para el motor de búsqueda, sin embargo, algunas veces, no queremos utilizarlos con este propósito, como en el ejemplo anterior "Nov(\.|iembre|ember)?". En este caso el establecimiento de este punto de referencia (que distcutiremos en futuras entregas) representa una inversión inútil de recursos por parte del motor de búsqueda. Para evitar esto podemos utilizar el signo de pregunta de la siguiente forma: "Nov(?:\.|iembre|ember)?". Aunque el resultado obtenido será el mismo, el motor de búsqueda no realizará una inversión inútil de recursos en este grupo, sino que lo ignorará. Cuando no sea necesario reutilizar el grupo, es aconsejable utilizar este formato.
De forma similar, podemos utilizar el signo de pregunta con otro significado: Los paréntesis redondos definen grupos "anónimos", sin embargo podemos utilizar el signo de pregunta en conjunto con los paréntesis triangulares "<>" para "nombrar" estos grupos de la siguiente forma: "^(?<Dia>\d\d)/(?<Mes>\d\d)/(?<Año>\d\d\d\d)$"; Con lo cual le decimos al motor de búsqueda que los primeros dos dígitos encontrados llevarán la etiqueta "Dia", los segundos la etiqueta "Mes" y los últimos cuatro dígitos llevarán la etiqueta "Año".

Nota: En futuras entregas veremos como utilizar los "puntos de referencia" establecidos por los paréntesis redondos, tanto los que se establecen en forma anónima, como los que se establecen con un determinado nombre.

A pesar de la complejidad y flexibilidad que nos dan los caracteres especiales que hemos estudiado hasta ahora, en su mayoría nos permiten encontrar solamente un caractér a la vez, o un grupo de caracteres a la vez. En la próxima entrega estudiaremos los últimos metacaracteres, que nos permiten establecer repeticiones.

Expresiones Regulares – 02

En la primera parte de esta serie hablamos de las herramientas necesarias para trabajar con las expresiones regulares. Dijimos que el mínimo para obtener un buen resultado era tener a mano una herramienta de cada tipo, una para el usuario final y otra de programación.

Aunque es posible utilizar las expresiones regulares con cualquier combinación de las herramientasmencionadas, este articulo y los demás de esta serie estarán basados en las dos herramientas que yo utilizo para mi trabajo con expresiones regulares: .Net Framework y EditPad Pro. Aunque el conocimiento general del tema no se verá afectado, si lo estarán las explicaciones prácticas acerca de la utilización de las herramientas y los ejemplos de código. También es necesario hacer notar que existen algunos detalles de sintaxis de las expresiones regulares propietarios del .Net Framework que se utilizan en forma diferente en las demás herramientas de programación. Cuando estos casos se den trataré de hacerlo notar para que el lector pueda buscar información respecto a estos detalles en fuentes adicionales.

ExReg como motor de búsqueda

Las expresiones regulares, como cualquier otro motor de búsqueda, permiten encontrar porciones especificas de texto dentro de una cadena más grande de caracteres. Así, si queremos encontrar el texto "lote" en la expresión "el ocelote salto al lote contiguo" cualquier motor de búsqueda seria capaz de encontrar lo que queremos. Sin embargo, la mayoría de los motores de búsqueda encontrarían también el fragmento "lote" de la palabra "ocelote", lo cual podría no ser lo que queremos. Algunos motores de búsqueda nos permiten adicionalmente especificar que queremos encontrar solamente palabras completas, solucionando este problema. Las expresiones regulares nos permiten especificar todas estas opciones adicionales y muchas otras sin necesidad de configurar opciones adicionales, sino utilizando el mismo texto que le damos a buscar como un lenguaje que nos permite decirle exactamente lo que deseamos encontrar en todos los casos, sin necesidad de recordar que debemos activar la opción de palabras completas la próxima vez que hagamos la búsqueda, ya que la misma búsqueda tendrá la opción incluida en el texto. Y esta representa solamente una de sus ventajas.

ExReg como lenguaje

Entonces, para especificar las opciones que deseamos dentro del texto a buscar utilizamos un "lenguaje" o "convención" mediante el cual le decimos al motor de búsqueda lo que queremos hacer. Este lenguaje le da un significado especial a una serie de caractéres. Por lo tanto cuando el motor de búsqueda de ExReg encuentre estos caractéres no los buscará en el texto en forma literal, sino que buscará lo que los caractéres significan. A estos caracteres se les llama algunas veces "metacaracteres". A continuación se listan los principales metacaracteres y su función y como los interpreta el motor de ExReg.

El Punto "."

El punto es interpretado por el motor de búsqueda como (casi) cualquier otro caracter. Y digo "casi" porque por efecto los caracteres que representan un salto de línea no corresponderán a un punto, a menos que se le especifique esto al motor de ExReg. Por lo tanto si esta opción se apaga en el motor de búsqueda que utilicemos, el punto le dirá al motor que encuentre cualquier caracter sin importar cual sea. En EditPad Pro esto se hace pro medio de la opción "dot matches newline" o "punto corresponde a nueva linea" en las opciones de búsqueda representadas a la derecha (Fig. 1). En .Net Framework se utiliza la opción RegexOptions.Singleline al efectuar la búsqueda o crear la expresión regular.

El punto se utiliza de la siguiente forma: Si se le dice al motor de RegEx que busque "g.t" en la cadena "el gato de piedra en la gótica puerta de getisboro goot" el motor de búsqueda encontrará "gat", "gót" y por último "get". Nóteses que el motor de búsqueda no encuentra "goot" esto es porque el punto representa un solo caracter y únicamente uno. Si queremos que también aparezca esta otra expresión, será necesario utilizar repreticiones, las cuales se explicarán más adelante.

Aunque el punto es muy útil para encontrar caractéres que no conocemos, es necesario recordar que corresponde a cualquier caracter y que muchas veces esto no es lo que queremos buscar. Es muy diferente buscar cualquier caracter que buscar cualquier caracter alfanumérico o cualquier digito o cualquier no-digito o cualquier no-alfanumérico. Debemos tomar esto en cuenta antes de utilizar el punto y obtener resultados que no deseamos.

Pero, que hacemos si queremos encontrar un punto dentro del texto? es aquí donde el siguiente caracter especial se vuelve útil.

La barra inversa "\"

Se utiliza para "marcar" el siguiente caracter de la expresión de búsqueda de forma que este adquiera un significado especial o deje de tenerlo. Osea, la barra inversa no se utiliza nunca por si sola, sino en combinación con otros caracteres. Al utilizarlo por ejemplo en combinación con el punto "\." este deja de tener su significado normal y empieza a comportarse como un caracter literal. Osea, respondiendo la pregunta de como podemos buscar un punto dentro de un texto utilizando ExReg, la respuesta seria utilizando la expresión "\."

De la misma forma, cuando se coloca la barra inversa seguida de cualquiera de los caracteres especiales que discutiremos a continuación, estos dejan de tener su significado especial y se convierten en caracteres de búsqueda literal.

Como ya dijimos, la barra inversa también puede darle significado especial a caracteres que no lo tienen. A continuación hay una lista de algunas de estas combinaciones:

  • \t – Representa un tabulador.
  • \r – Representa el "regreso al inicio" osea el lugar en que la linea vuelve a iniciar.
  • \n – Representa la "nueva linea" el caracter por medio del cual una linea da inicio. Es necesario recordar aqui que en Windows es necesaria una combinación de \r\n para comenzar una nueva linea, mientras que en Unix solamente se usa \n.
  • \a – Representa una "campana" o "beep" que se produce al imprimir este caracter (¿exótico, verdad?)
  • \e – Representa la tecla "Esc" o "Escape"
  • \f – Representa un salto de página
  • \v – Representa un tabulador vertical (!?)
  • \x – Se utiliza para representar caracteres ASCII o ANSI si conocemos su código. De esta forma, si estamos buscando el símbolo de derechos de autor y estamos usando el conjunto de caracteres Latin-1 podemos encontrarlo utilizando "\xA9".
  • \u – Se utiliza para representar caracters Unicode si conocemos su código. "\u00A2" nos da el símbolo de centavos (que es muy útil para representar también colones costarricenses). No todos los motores de RegEx soportan Unicode. El .Net Framework lo hace, pero el EditPad Pro no, por ejemplo.
  • \d – Representa un dígito del 0 al 9.
  • \w – Representa cualquier caracter alfanumérico.
  • \s – Representa un espacio en blanco.
  • \D – Representa cualquier caracter que no sea un dígito del 0 al 9.
  • \W – Representa cualquier caracter no alfanumérico.
  • \S – Representa cualquier caracter que no sea un espacio en blanco.
  • \A – Representa el inicio de la cadena. No un caracter sino una posición.
  • \Z – Representa el final de la cadena. No un caracter sino una posición.
  • \b – Marca el inicio y el final de una palabra.
  • \B – Marca la posición entre dos caractéres alfanuméricos o dos no-alfanuméricos.

La utilidad Charmap.exe de Windows nos puede ayudar a encontrar los códigos ASCII/ANSI/UNICODE que necesitemos.

En la próxima entrega continuaremos con la lista de caractéres especiales y su significado.

Expresiones Regulares – 01

Las expresiones regulares son un método por medio del cual se pueden realizar búsquedas dentro de cadenas de caracteres. Sin importar si estamos buscando dos caracteres en una cadena de 10 o si necesitamos encontrar todas las apariciones de un patrón definido de caracteres en un archivo de millones de caracteres, las expresiones regulares nos proporcionan una solución para nuestro problema. Adicionalmente, es importante decir, que un uso derivado de la búsqueda de patrones es la validación de un formato especifico en una cadena de caractedes dada, pero este es un tema que tocaremos más adelante.

Donde encontrar las expresiones regulares

Para poder utilizar las expresiones regulares es necesario tener acceso a un motor de búsqueda con la capacidad de utilizarlas. Podemos clasificar los motores disponibles en dos tipos: Motores para el programador y Motores para el usuario final.

Motores para el usuario final: Son programas que permiten realizar búsquedas sobre el contenido de un archivo o sobre un texto extraido y colocado en el programa. Están diseñados para permitir al usuario el uso de búsquedas avanzadas usando este mecanismo, sin embargo es necesario aprender a redactar expresiones regulares adecuadas para poder utilizarlos eficientemente. Estos son algunos de los programas disponibles:

  • grep: Programa del mundo Linux.
  • ProwerGrep: versión de grep para 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.

Motores para el programador: Algunas veces encontrar lo que queremos dentro de un archivo no es suficiente y es necesario automatizar el proceso de búsqueda de modo que sea posible utilizarlo muchas veces para un propósito específico. Es aquí donde se vuelve útil que la herramienta con la cual estamos programando nos permita el uso de expresiones regulares, para realizar nuestras búsquedas y validaciones. Estas son las herramientas de programación disponibles que ofrecen motores de búsqueda con soporte a expresiones regulares:

  • Java: Existen varias librerias hechas para java que permiten el uso de RegEx, y Sun planea dar soporte a estas desde el SDK
  • JavaScript: Me sorprendió bastante saber que 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 a lo que son hoy.
  • PCRE: Librería de ExReg para C, C++ y otros lenguajes que puedan utilizar librerias dll (VB6 por ejemplo).
  • PHP: Tiene dos tipos diferentes de expresiones regulares disponibles para el programador.
  • Python: Lenguaje de "scripting" popular con soporte a ExReg.
  • .Net Framework: En mi opinión la más poderosa herramienta para el uso de ExReg; no porque sea superior a los demás lenguajes mencionados en este campo, sino porque en conjunto con las demás librerías de clases base, provee un  conjunto inigualable de utilitarios para el programador.

Aunque hasta ahora no hemos profundizado en la estructura y la definición de las expresiones regulares, es importante que antes de tomarlas en cuenta como una opción viable para dar solución al problema que se tiene por delante, estemos seguros de que tendremos acceso al menos a una herramienta de cada tipo (una para el usuario final y otra para el programador) de modo que el proceso de creación de la solución para nuestro problema no se convierta en un dolor de cabeza o eventualmente en una pérdida de tiempo. Una vez se tiene a mano el lenguaje de programación elegido y el programa que apoyará el proceso de creación, podemos adentrarnos en el aprendizaje de este lenguaje tan útil y poderoso.

Expresiones Regulares – Introducción

Una de las cosas que más me emocionan en la vida es el poder aprender. Y gracias al proyecto que estoy desarrollando en mi nuevo trabajo he logrado incursionar en una nueva área de aprendizaje: Las expresiones regulares.

Aunque hace tiempo, cuando inicié el estudio del .Net Framework, me había topado ocasionalmente con las clases del System.Text.RegularExpressions, nunca había profundizado en su utilidad y en su gran potencial.

No fue hasta este proyeto en el que me vi en la necesidad de buscar una forma facil de encontrar el contenido de las etiquetas html de una página web, que me tope de frente con el hecho de que las funciones IndexOf y SubString no iban a representar una opción viable a corto plazo, para este propósito.

Luego de una búsqueda extensa en Internet encontré varios sitios que hablaban sobre la utilidad de las expresiones regulares para este propósito y comencé a investigar. Luego de varias lecturas comprendí dos cosas importantes:

– Utilizar las expresiones regulares era la mejor forma de resolver mi problema.

– No sabía nada acerca de ellas.

Obviamente el segundo problema era el primero a resolver, y como siempre, inicié mi búsqueda en el punto más lógico: la ayuda del .Net Framework. Sin embargo me tope con un problema: la ayuda describe con detalle como usar las clases para manejar las expresiones regulares, pero toca en forma muy superficial el tema de estas como un lenguaje.

Así que el siguiente paso lógico – una búsqueda en Internet – me llevó al siguiente sitio:

http://www.regular-expressions.info/tutorial.html

Este lugar llenó todas mis necesidades de aprendizaje y el resto fue experimentar con una de las versiones de prueba de los programas mencionados en el sitio (el EditPad Pro) el cual terminó de aclarar todas mis dudas en la práctica.

En las siguientes entregas de esta serie tratare de resumir en forma fácil de asimilar el conocimiento adquirido en esta investigación y algunas de las formas en las que lo he puesto en práctica.