Ir al contenido

Expresi�n regular

De Wikipedia, la enciclopedia libre
(Redirigido desde �Expresiones regulares�)
La expresi�n regular (?<=\.) {2,}(?=[A-Z]) devuelve resultados cuando existen al menos dos espacios que ocurren despu�s del punto (.) y antes de una letra may�scula, como se ve resaltado en este texto
Stephen Kleene, quien ayud� a fundar el concepto

En c�mputo te�rico y teor�a de lenguajes formales, una expresi�n regular o expresi�n racional [1][2]​ (tambi�n son conocidas como regex o regexp,[3]​ por su contracci�n de las palabras inglesas regular expression) es una secuencia de caracteres que conforma un patr�n de b�squeda. Se utilizan principalmente para la b�squeda de patrones de cadenas de caracteres u operaciones de sustituciones.

Las expresiones regulares son patrones utilizados para encontrar una determinada combinaci�n de caracteres dentro de una cadena de texto. Las expresiones regulares proporcionan una manera muy flexible de buscar o reconocer cadenas de texto. Por ejemplo, el grupo formado por las cadenas Handel, H�ndel y Haendel se describe con el patr�n H(a|�|ae)ndel.

La mayor�a de las formalizaciones proporcionan los siguientes constructores: una expresi�n regular es una forma de representar los lenguajes regulares (finitos o infinitos) y se construye utilizando caracteres del alfabeto sobre el cual se define el lenguaje.

Construcci�n de una expresi�n regular

[editar]

Espec�ficamente, las expresiones regulares se construyen utilizando los operadores uni�n, concatenaci�n y clausura de Kleene. Toda expresi�n regular tiene alg�n aut�mata finito asociado.

Alternaci�n

[editar]

Una pleca o barra vertical separa las alternativas, las cuales son evaluadas de izquierda a derecha. Por ejemplo, amarillo|azul se corresponde con amarillo o azul.

Cuantificaci�n

[editar]

Un cuantificador tras un car�cter especifica la frecuencia con la que este puede ocurrir. Los cuantificadores m�s comunes son ?, + y *:

  • El signo de interrogaci�n ? indica que el car�cter que le precede es opcional. Por ejemplo, ob?scuro se corresponde con oscuro y obscuro.
  • El signo m�s + indica que el car�cter que le precede debe aparecer al menos una vez. Por ejemplo, ho+la describe el conjunto infinito hola, hoola, hooola, hoooola, etc�tera.
  • El asterisco * indica que el car�cter que le precede puede aparecer cero, una, o m�s veces. Por ejemplo, 0*42 se corresponde con 42, 042, 0042, 00042, etc�tera.

Agrupaci�n

[editar]

Los par�ntesis pueden usarse para definir el �mbito y precedencia de los dem�s operadores. Por ejemplo, (p|m)adre es lo mismo que padre|madre, y (des)?amor se corresponde con amor y con desamor.

Los constructores pueden combinarse libremente dentro de la misma expresi�n, por lo que H(ae?|�)ndel equivale a H(a|ae|�)ndel. La sintaxis precisa de las expresiones regulares cambia seg�n las herramientas y aplicaciones consideradas.

Aplicaciones

[editar]

Su utilidad m�s obvia es la de describir un conjunto de cadenas para una determinada funci�n, resultando de utilidad en editores de texto y otras aplicaciones inform�ticas para buscar y manipular textos.

Numerosos editores de texto y otras herramientas utilizan expresiones regulares para buscar y reemplazar patrones en un texto. Por ejemplo, las herramientas proporcionadas por las distribuciones de Unix (incluyendo el editor sed y el filtro grep) popularizaron el concepto de expresi�n regular entre usuarios no programadores, aunque ya era familiar entre los programadores.

Inicialmente, este reconocimiento de cadenas se programaba para cada aplicaci�n sin mecanismo alguno inherente al lenguaje de programaci�n pero, con el tiempo, se ha ido incorporando el uso de expresiones regulares para facilitar programar la detecci�n de ciertas cadenas. Por ejemplo, Perl tiene un potente motor de expresiones regulares directamente incluido en su sintaxis. Otros lenguajes lo han incorporado como funciones espec�ficas sin incorporarlo a su sintaxis.

Uso en programaci�n

[editar]
Nota: Para el entendimiento completo de esta secci�n es necesario poseer conocimientos generales acerca de lenguajes de programaci�n

En el �rea de la programaci�n, las expresiones regulares son un m�todo por medio del cual se pueden realizar b�squedas dentro de cadenas de caracteres. Sin importar la amplitud de la b�squeda requerida de un patr�n definido de caracteres, las expresiones regulares proporcionan una soluci�n pr�ctica al problema. Adicionalmente, un uso derivado de la b�squeda de patrones es la validaci�n de un formato espec�fico en una cadena de caracteres dada, como por ejemplo fechas o identificadores.

Para poder utilizar las expresiones regulares al programar es necesario tener acceso a un motor de b�squeda con la capacidad de utilizarlas. Es posible clasificar los motores disponibles en dos tipos seg�n su uso: 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 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. Algunos programas disponibles de este tipo son:

  • grep: programa de los sistemas operativos Unix/Linux.
  • sed: programa de los sistemas operativos Unix/Linux que permite la modificaci�n de la salida.
  • PowerGrep: versi�n de grep para los sistemas operativos Windows.
  • Sublime Text: permite realizar b�squedas/reemplazos con expresiones regulares sobre archivos (gratuito).
  • RegexBuddy: ayuda a crear las expresiones regulares en forma interactiva y luego le permite al usuario usarlas y guardarlas (no gratuito).
  • 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 (no gratuito).

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:

  • AWK: Forma una parte esencial del lenguaje y por extensi�n de la herramienta awk de Unix/Linux
  • C++: Desde su versión C++11 es posible utilizar expresiones regulares mediante la biblioteca estándar, usando la cabecera <regex>.
  • Java: existen varias bibliotecas 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.
  • 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: biblioteca de ExReg para C, C++ y otros lenguajes que puedan utilizar bibliotecas dll (Visual Basic 6 por ejemplo).
  • PHP: tiene dos tipos diferentes de expresiones regulares disponibles para el programador, aunque la variante POSIX (ereg) va a ser desechada en PHP 6.
  • Python: lenguaje de scripting con soporte de expresiones regulares mediante su biblioteca re.
  • .Net Framework: provee un conjunto de clases mediante las cuales es posible utilizar expresiones regulares para hacer búsquedas, reemplazar cadenas y validar patrones.

Nota: de las herramientas mencionadas con anterioridad se utilizan el EditPad Pro y el .Net Framework para dar ejemplos, también es posible utilizar las expresiones regulares con cualquier combinación de las herramientas mencionadas. Aunque en general las Expresiones Regulares utilizan un lenguaje común en todas las herramientas, las explicaciones prácticas acerca de la utilización de las herramientas y los ejemplos de código deben ser interpretados de forma diferente. También es necesario hacer notar que existen algunos detalles de sintaxis de las expresiones regulares que son propios del .Net Framework que se utilizan en forma diferente en las demás herramientas de programación. Cuando estos casos se den se hará notar en forma explícita para que el lector pueda buscar información respecto a estos detalles en fuentes adicionales. En el futuro se incluirán adicionalmente ejemplos de otras herramientas y lenguajes de programación.

Expresiones regulares como motor de búsqueda

Las expresiones regulares permiten encontrar porciones específicas de texto dentro de una cadena más grande de caracteres. Así, si es necesario encontrar el texto "lote" en la expresión "el ocelote saltó al lote contiguo" cualquier motor de búsqueda sería capaz de efectuar esta labor. 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 el resultado esperado. Algunos motores de búsqueda permiten adicionalmente especificar que se desea encontrar solamente palabras completas, solucionando este problema. Las expresiones regulares permiten especificar todas estas opciones adicionales y muchas otras sin necesidad de configurar opciones adicionales, sino utilizando el mismo texto de búsqueda como un lenguaje que permite enviarle al motor de búsqueda exactamente lo que deseamos encontrar en todos los casos, sin necesidad de activar opciones adicionales al realizar la búsqueda.

Expresiones regulares como lenguaje

Para especificar opciones dentro del texto a buscar se utiliza un lenguaje o convención mediante el cual se le transmite al motor de búsqueda el resultado que se desea obtener. Este lenguaje le da un significado especial a una serie de caracteres. Por lo tanto cuando el motor de búsqueda de expresiones regulares encuentre estos caracteres no los buscará en el texto en forma literal, sino que buscará lo que los caracteres significan. A estos caracteres se les llama algunas veces "meta-caracteres". A continuación se listan los principales meta-caracteres y su función y cómo los interpreta el motor de expresiones regulares.

Descripción

[editar]

El punto "."

[editar]

El punto se interpreta por el motor de búsqueda como "cualquier carácter", es decir, busca cualquier carácter incluyendo los saltos de línea. Los motores de expresiones regulares tienen una opción de configuración que permite modificar este comportamiento. En .Net Framework se utiliza la opción RegexOptions.Singleline para especificar la opción de que busque todos los caracteres incluidos el salto de línea (\n).

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ótese que el motor de búsqueda no encuentra "goot"; esto es porque el punto representa un solo carácter y únicamente uno. Si es necesario que el motor encuentre también la expresión "goot", será necesario utilizar repeticiones, las cuales se explican más adelante.

Aunque el punto es muy útil para encontrar caracteres que no conocemos, es necesario recordar que corresponde a cualquier carácter y que muchas veces esto no es lo que se requiere. Es muy diferente buscar cualquier carácter que buscar cualquier carácter alfanumérico o cualquier dígito o cualquier no-dígito o cualquier no-alfanumérico. Se debe tomar esto en cuenta antes de utilizar el punto y obtener resultados no deseados.

El signo de exclamación "!"

[editar]

Se utiliza para realizar una "búsqueda anticipada negativa". La construcción de la expresión regular es con el par de paréntesis, el paréntesis de apertura seguido de un signo de interrogación y un signo de exclamación. Dentro de la búsqueda tenemos la expresión regular. Por ejemplo, para excluir exactamente una palabra, habrá que utilizar ^(palabra.+|(?!palabra).*)$.

La barra inversa o contrabarra "\"

[editar]

La barra inversa se utiliza para escapar el siguiente carácter de la expresión de búsqueda de forma que este adquiera un significado especial o deje de tenerlo. O sea, la barra inversa no se utiliza nunca por sí 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 se comporta como un carácter literal.

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 se mencionó con anterioridad, 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 "retorno de carro" o "regreso al inicio" o sea el lugar en que la línea vuelve a iniciar.
  • \n — Representa la "nueva línea" el carácter por medio del cual una línea da inicio. Es necesario recordar que en Windows es necesaria una combinación de \r\n para comenzar una nueva línea, mientras que en Unix solamente se usa \n y en Mac_OS clásico se usa solamente \r.
  • \a — Representa una "campana" o "beep" que se produce al imprimir este carácter.
  • \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 conoce su código. De esta forma, si se busca el símbolo de derechos de autor y la fuente en la que se busca utiliza el conjunto de caracteres latín-1 es posible encontrarlo utilizando \xA9".
  • \u — Se utiliza para representar caracteres Unicode si se conoce su código. "\u00A2" representa el símbolo de centavos. No todos los motores de Expresiones Regulares 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 carácter alfanumérico.
  • \s — Representa un espacio en blanco.
  • \D — Representa cualquier carácter que no sea un dígito del 0 al 9.
  • \W — Representa cualquier carácter no alfanumérico.
  • \S — Representa cualquier carácter que no sea un espacio en blanco.
  • \A — Representa el inicio de la cadena. No un carácter sino una posición.
  • \Z — Representa el final de la cadena. No un carácter sino una posición.
  • \b — Marca la posición de una palabra limitada por espacios en blanco, puntuación o el inicio/final de una cadena.
  • \B — Marca la posición entre dos caracteres alfanuméricos o dos no-alfanuméricos.
  • \Q y \E — Se interpreta como literal todo lo que vaya entre estas dos marcas. Ejemplo: \Q.*\E se interpreta como el literal .*.


Notas:

  • Utilidades como Charmap.exe de Windows o gucharmap de GNOME permiten encontrar los códigos ASCII/ANSI/UNICODE para utilizarlos en Expresiones Regulares.
  • Algunos lenguajes, como Java, asignan su propio significado a la barra invertida, por lo que deberá repetirse para que sea considerada una expresión regular (ejemplo String expresion="\\d.\\d" para indicar el patrón \d.\d).

Los corchetes "[ ]"

[editar]

La función de los corchetes en el lenguaje de las expresiones regulares es representar "clases de caracteres", o sea, agrupar caracteres en grupos o clases. Son útiles cuando es necesario buscar uno de un grupo de caracteres. Dentro de los corchetes es posible utilizar el guion - para especificar rangos de caracteres.

Adicionalmente, los metacaracteres pierden su significado y se convierten en literales cuando se encuentran dentro de los corchetes. Por ejemplo, como vimos en la entrega anterior, \d es útil para buscar cualquier carácter 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 carácter que representa un dígito o un punto se puede utilizar la expresión regular [\d.]. Como se hizo notar anteriormente, dentro de los corchetes, el punto representa un carácter literal y no un metacarácter, por lo que no es necesario antecederlo con la barra inversa. El único carácter que es necesario anteceder con la barra inversa dentro de los corchetes es la propia barra inversa.

La expresión regular [\dA-Fa-f] nos permite encontrar dígitos hexadecimales. Los corchetes nos permiten también encontrar palabras aun si están escritas de forma errónea, por ejemplo, la expresión regular expresi[oó]n permite encontrar en un texto la palabra "expresión" aunque se haya escrito con o sin tilde. Es necesario aclarar que sin importar cuantos caracteres se introduzcan dentro del grupo por medio de los corchetes, el grupo sólo le dice al motor de búsqueda que encuentre un solo carácter del grupo a la vez, es decir, que expresi[oó]n encontrará "expresion" o "expresión" pero no "expresioón".

La barra "|"

[editar]

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 permitirá encontrar cualquiera de los nombres de los puntos cardinales. La barra se utiliza comúnmente en conjunto con otros caracteres especiales.

El signo de d�lar "$"

[editar]

Representa el final de la cadena de caracteres o el final de la l�nea, si se utiliza el modo multil�nea. No representa un car�cter en especial sino una posici�n. Si se utiliza la expresi�n regular \.$ el motor encontrar� todos los lugares donde un punto finalice la l�nea, lo que es �til para avanzar entre p�rrafos.

El acento circunflejo "^"

[editar]

Este car�cter tiene una doble funcionalidad, que difiere cuando se utiliza individualmente y cuando se utiliza en conjunto con otros caracteres especiales. En primer lugar su funcionalidad como car�cter individual: el car�cter ^ representa el inicio de la cadena (de la misma forma que el signo de d�lar $ representa el final de la cadena). Por tanto, si se utiliza la expresi�n regular ^[a-z] el motor encontrar� todos los p�rrafos que den inicio con una letra min�scula. Cuando se utiliza en conjunto con los corchetes de la siguiente forma [^\w ] permite encontrar cualquier car�cter que NO se encuentre dentro del grupo indicado. La expresi�n indicada permite encontrar, por ejemplo, cualquier car�cter que no sea alfanum�rico o un espacio, es decir, busca todos los s�mbolos de puntuaci�n y dem�s caracteres especiales.

La utilizaci�n en conjunto de los caracteres especiales ^ y $ permite realizar validaciones en forma sencilla. Por ejemplo ^\d$ permite asegurar que la cadena a verificar representa un �nico d�gito ^\d\d/\d\d/\d\d\d\d$ permite validar una fecha en formato corto, aunque no permite verificar si es una fecha v�lida, ya que 99/99/9999 tambi�n ser�a v�lido en este formato; la validaci�n completa de una fecha tambi�n es posible mediante expresiones regulares, como se ejemplifica m�s adelante.

Los par�ntesis "()"

[editar]

De forma similar que los corchetes, los par�ntesis sirven para agrupar caracteres, sin embargo existen varias diferencias fundamentales entre los grupos establecidos por medio de corchetes y los grupos establecidos por par�ntesis:

  • Los caracteres especiales conservan su significado dentro de los par�ntesis.
  • Los grupos establecidos con par�ntesis establecen una "etiqueta" o "punto de referencia" para el motor de b�squeda que puede ser utilizada posteriormente como se denota m�s adelante.
  • Utilizados en conjunto con la barra | permite hacer b�squedas opcionales. Por ejemplo la expresi�n regular al (este|oeste|norte|sur) de permite buscar textos que den indicaciones por medio de puntos cardinales, mientras que la expresi�n regular este|oeste|norte|sur encontrar�a "este" en la palabra "esteban", no pudiendo cumplir con este prop�sito.
  • Utilizados en conjunto con otros caracteres especiales que se detallan posteriormente, ofrece funcionalidad adicional.

El signo de interrogaci�n "?"

[editar]

El signo de interrogaci�n 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 permite encontrar tanto "oscuridad" como "obscuridad". En conjunto con los par�ntesis redondos permite especificar que un conjunto mayor de caracteres es opcional; por ejemplo Nov(\.|iembre|ember)? permite encontrar tanto "Nov" como "Nov.", "Noviembre" y "November".

Como se mencion� anteriormente, los par�ntesis nos permiten establecer un "punto de referencia" para el motor de b�squeda. Sin embargo, algunas veces, no se desea utilizarlos con este prop�sito, como en el ejemplo anterior Nov(\.|iembre|ember)?. En este caso el establecimiento de este punto de referencia (que se detalla m�s adelante) representa una inversi�n in�til de recursos por parte del motor de b�squeda. Para evitarlo se puede 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, es posible utilizar el signo de pregunta con otro significado: Los par�ntesis definen grupos "an�nimos", sin embargo el signo de pregunta en conjunto con los par�ntesis triangulares (< y >) permite "nombrar" estos grupos de la siguiente forma: ^(?<D�a>\d\d)\/(?<Mes>\d\d)\/(?<A�o>\d\d\d\d)$; Con lo cual se le especifica al motor de b�squeda que los primeros dos d�gitos encontrados llevar�n la etiqueta "D�a", los segundos la etiqueta "Mes" y los �ltimos cuatro d�gitos llevar�n la etiqueta "A�o".

NOTA: a pesar de la complejidad y flexibilidad dada por los caracteres especiales estudiados hasta ahora, en su mayor�a nos permiten encontrar solamente un car�cter a la vez, o un grupo de caracteres a la vez. Los metacaracteres enumerados en adelante permiten establecer repeticiones.

Las llaves "{}"

[editar]

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 f�rmula podr�amos convertir el ejemplo ^\d\d/\d\d/\d\d\d\d$ que 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.

\d{2,4} Esta forma a�ade un segundo n�mero separado por una coma, el cual indica al motor de b�squeda que como m�ximo podr�a aparecer 4 veces la expresi�n regular \d. Los posibles valores son:

  • ^\d\d$ (m�nimo 2 repeticiones)
  • ^\d\d\d$ (tiene 3 repeticiones, por lo tanto entra en el rango 2-4)
  • ^\d\d\d\d$ (m�ximo 4 repeticiones)

Nota: aunque esta forma de encontrar elementos repetidos es muy �til, algunas veces no se conoce con claridad cuantas veces se repite lo que se busca o su grado de repetici�n es variable. En estos casos los siguientes metacaracteres son �tiles.

El asterisco "*"

[editar]

El asterisco sirve para encontrar algo que se encuentra repetido 0 o m�s veces. Por ejemplo, utilizando la expresi�n [a-zA-Z]\d* ser� posible encontrar tanto "H" como "H1", "H01", "H100" y "H1000", es decir, una letra seguida de un n�mero indefinido de d�gitos. 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 se busca. De esta forma si se utiliza \(.*\) para encontrar cualquier cadena que se encuentre entre par�ntesis y se lo aplica sobre el texto "Ver (Fig. 1) y (Fig. 2)" se esperar�a que el motor de b�squeda encuentre los textos "(Fig. 1)" y "(Fig. 2)", sin embargo, debido a esta caracter�stica, en su lugar encontrar� el texto "(Fig. 1) y (Fig. 2)". Esto sucede porque el asterisco le dice al motor de b�squeda que llene todos los espacios posibles entre los dos par�ntesis. Para obtener el resultado deseado se debe utilizar el asterisco en conjunto con el signo de interrogaci�n de la siguiente forma: \(.*?\) Esto es equivalente a decirle al motor de b�squeda que "Encuentre un par�ntesis de apertura y luego encuentre cualquier secuencia de caracteres hasta que encuentre un par�ntesis de cierre".

El signo de suma "+"

[editar]

Se utiliza para encontrar una cadena que se encuentre repetida una 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 metacar�cter en conjunto con el signo de interrogaci�n para limitar hasta donde se efect�a la repetici�n.

Grupos an�nimos

[editar]

Los grupos an�nimos se establecen cada vez que se encierra una expresi�n regular en par�ntesis, por lo que la expresi�n <([a-zA-Z]\w*?)> define un grupo an�nimo. El motor de b�squeda almacenar� una referencia al grupo an�nimo que corresponda a la expresi�n encerrada entre los par�ntesis.

La forma m�s inmediata de utilizar los grupos que se definen, es dentro de la misma expresi�n regular, lo cual se realiza utilizando la barra inversa "\" seguida del n�mero del grupo al que se desea hacer referencia de la siguiente forma: <([a-zA-Z]\w*?)>.*?</\1> Esta expresi�n regular encontrar� tanto la cadena "<span>Esta</span>" como la cadena "<b>prueba</b>" en el texto "<span>Esta</span> 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 se est� utilizando. Cada lenguaje tiene una forma distinta de acceder a los grupos. Los ejemplos enumerados a continuaci�n utilizan las clases del .Net Framework, usando la sintaxis de C# (la cual puede f�cilmente adaptarse a VB .Net o cualquier otro lenguaje del Framework o incluso Java o JavaScript).

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 se desea 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 se puede 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 se les asigna 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, a continuaci�n se explica como hacerlo en el motor del .Net Framework.

Utilizando el ejemplo anterior es posible convertir <([a-zA-Z]\w*?)> en <(?<TagName>[a-zA-Z]\w*?)> Para encontrar etiquetas HTML. N�tese el signo de pregunta y el texto "TagName" encerrado entre par�ntesis triangulares, seguido de este. Para utilizar este ejemplo en el .Net Framework es posible utilizar 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 se puede definir algo como: <(?<TagName>[a-zA-Z]\w*?) ?(?<Attributes>.*?)> para encontrar no solo el nombre del tag HTML sino también 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 es posible ir mucho más allá de la siguiente forma:

   "<?(?<TagName>[a-zA-Z][\w\r\n]*?) ?(?:(?<Attribute>[\w-\r\n]*?)='?"?(?<Value>[\w-:;,\./= \r\n]*?)'?"? ?)>"

Esta expresión permite encontrar el nombre de la etiqueta, el nombre del atributo y su valor.

Sin embargo, una etiqueta HTML puede tener más de un atributo. Este puede resolverse utilizando repeticiones de la siguiente forma:

   "<?(?<TagName>[a-zA-Z][\w\r\n]*?) ?(?:(?<Attribute>[\w-\r\n]*?)='?"?(?<Value>[\w-:;,\./= \r\n]*?)'?"? ?)*?>"

Y en el código puede utilizarse 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)
     }
   }

Es posible profundizar utilizando una expresión regular como esta:

   "<?(?<TagName>[a-zA-Z][\w\r\n]*?) ?(?:(?<Attribute>[\w-\r\n]*?)='?"?(?<Value>[\w-:;,\./= \r\n]*?)'?"? ?)*?>(?<Content>.*?)</\1>"

La cual permitiría encontrar el nombre de la etiqueta, sus atributos, valores y el contenido de esta, todo con una sola expresión regular.

Referencias

[editar]
  1. Mitkov, Ruslan (2003). The Oxford Handbook of Computational Linguistics (en inglés). Oxford University Press. ISBN 978-0-19-927634-9. 
  2. Lawson, Mark V. (17 de septiembre de 2003). Finite Automata (en inglés). CRC Press. ISBN 978-1-58488-255-8. 
  3. «What Regular Expressions Are Exactly - Terminology» (html) (en inglés). 21 de septiembre de 2017. Archivado desde el original el 21 de septiembre de 2017. Consultado el 11 de agosto de 2019. «Their name comes from the mathematical theory on which they are based. But we will not dig into that. You will usually find the name abbreviated to "regex" or "regexp". This tutorial uses "regex", because it is easy to pronounce the plural "regexes".» 

Enlaces externos

[editar]