fbpx
Wikipedia

Expresión regular

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.

(?<=\.) {2,}(?=[A-Z]) hace pareja cuando existen por lo menos dos espacios que ocurren después del punto (.) y antes de una letra mayúscula, como resaltado en el texto aquí
Stephen Kleene, quien ayudó a fundar el concepto

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

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

Una 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

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 puede aparecer como mucho una vez. 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

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

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.

Las expresiones regulares en programación

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 .
  • 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 de las expresiones regulares

El punto "."

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 admiración "!"

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 "\"

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.

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 "[ ]"

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" nos 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 podemos 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 a la vez, es decir, que "expresi[oó]n" encontrará "expresion" o "expresión".

La barra "|"

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 "$"

Representa el final de la cadena de caracteres o el final de la línea, si se utiliza el modo multi-lí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 "^"

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 "()"

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 "?"

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 "<>" 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 "{}"

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 debe 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 "*"

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 "+"

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

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

  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. (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

  • Manual sobre Expresiones Regulares
  • (en inglés) Prueba y explicación de expresiones regulares en línea.
  • (en inglés) Tutorial de expresiones regulares en Python.
  • (en inglés) Modo de empleo de expresiones regulares en Python.
  • (en inglés) Learn about regular expressions in Python.
  • Páginas de manual Perl sobre exp. reg.:
    • perlrequick - Guía rápida de las expresiones regulares
    • perlretut - Tutorial de expresiones regulares
    • perlre - Manual sobre expresiones regulares en Perl
    • perlrebackslash - Secuencias de escape en expresiones regulares en Perl
    • perlrecharclass - Clases de caracteres en expresiones regulares Perl
    • perlreref - Referencia de expresiones regulares en Perl
  •   Datos: Q185612
  •   Multimedia: Regex

expresión, regular, este, artículo, sección, tiene, estilo, difícil, entender, para, lectores, interesados, tema, puedes, favor, edítalo, contribuye, hacerlo, más, accesible, para, público, general, eliminar, detalles, técnicos, interesan, especialistas, cómpu. Este articulo o seccion tiene un estilo dificil de entender para los lectores interesados en el tema Si puedes por favor editalo y contribuye a hacerlo mas accesible para el publico general sin eliminar los detalles tecnicos que interesan a los especialistas En computo teorico y teoria de lenguajes formales una expresion regular o expresion racional 1 2 tambien son conocidas como regex o regexp 3 por su contraccion de las palabras inglesas regular expression es una secuencia de caracteres que conforma un patron de busqueda Se utilizan principalmente para la busqueda de patrones de cadenas de caracteres u operaciones de sustituciones lt 2 A Z hace pareja cuando existen por lo menos dos espacios que ocurren despues del punto y antes de una letra mayuscula como resaltado en el texto aqui Stephen Kleene quien ayudo a fundar el concepto Las expresiones regulares son patrones utilizados para encontrar una determinada combinacion 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 Handel y Haendel se describe con el patron H a a ae ndel La mayoria de las formalizaciones proporcionan los siguientes constructores una expresion 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 Indice 1 Construccion de una expresion regular 1 1 Alternacion 1 2 Cuantificacion 1 3 Agrupacion 2 Aplicaciones 3 Las expresiones regulares en programacion 4 Descripcion de las expresiones regulares 4 1 El punto 4 2 El signo de admiracion 4 3 La barra inversa o contrabarra 4 4 Los corchetes 4 5 La barra 4 6 El signo de dolar 4 7 El acento circunflejo 4 8 Los parentesis 4 9 El signo de interrogacion 4 10 Las llaves 4 11 El asterisco 4 12 El signo de suma 4 13 Grupos anonimos 5 Referencias 6 Enlaces externosConstruccion de una expresion regular EditarEspecificamente las expresiones regulares se construyen utilizando los operadores union concatenacion y clausura de Kleene Toda expresion regular tiene algun automata finito asociado Alternacion Editar Una barra vertical separa las alternativas las cuales son evaluadas de izquierda a derecha Por ejemplo amarillo azul se corresponde con amarillo o azul Cuantificacion Editar Un cuantificador tras un caracter especifica la frecuencia con la que este puede ocurrir Los cuantificadores mas comunes son y El signo de interrogacion indica que el caracter que le precede puede aparecer como mucho una vez Por ejemplo ob scuro se corresponde con oscuro y obscuro El signo mas indica que el caracter que le precede debe aparecer al menos una vez Por ejemplo ho la describe el conjunto infinito hola hoola hooola hoooola etcetera El asterisco indica que el caracter que le precede puede aparecer cero una o mas veces Por ejemplo 0 42 se corresponde con 42 042 0042 00042 etcetera Agrupacion Editar Los parentesis pueden usarse para definir el ambito y precedencia de los demas 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 expresion por lo que H ae a ndel equivale a H a ae a ndel La sintaxis precisa de las expresiones regulares cambia segun las herramientas y aplicaciones consideradas Aplicaciones EditarSu utilidad mas obvia es la de describir un conjunto de cadenas para una determinada funcion resultando de utilidad en editores de texto y otras aplicaciones informaticas 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 expresion regular entre usuarios no programadores aunque ya era familiar entre los programadores Inicialmente este reconocimiento de cadenas se programaba para cada aplicacion sin mecanismo alguno inherente al lenguaje de programacion pero con el tiempo se ha ido incorporando el uso de expresiones regulares para facilitar programar la deteccion 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 especificas sin incorporarlo a su sintaxis Las expresiones regulares en programacion EditarNota Para el entendimiento completo de esta seccion es necesario poseer conocimientos generales acerca de lenguajes de programacionEn el area de la programacion las expresiones regulares son un metodo por medio del cual se pueden realizar busquedas dentro de cadenas de caracteres Sin importar la amplitud de la busqueda requerida de un patron definido de caracteres las expresiones regulares proporcionan una solucion practica al problema Adicionalmente un uso derivado de la busqueda de patrones es la validacion de un formato especifico 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 busqueda con la capacidad de utilizarlas Es posible clasificar los motores disponibles en dos tipos segun su uso motores para el programador y motores para el usuario final Motores para el usuario final son programas que permiten realizar busquedas sobre el contenido de un archivo o sobre un texto extraido y colocado en el programa Estan disenados para permitir al usuario realizar busquedas 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 modificacion de la salida PowerGrep version de grep para los sistemas operativos Windows Sublime Text permite realizar busquedas 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 busquedas con expresiones regulares sobre archivos y las muestra por medio de codigo de colores para facilitar su lectura y comprension no gratuito Motores para el programador permiten automatizar el proceso de busqueda de modo que sea posible utilizarlo muchas veces para un proposito especifico Estas son algunas de las herramientas de programacion disponibles que ofrecen motores de busqueda con soporte a expresiones regulares AWK Forma una parte esencial del lenguaje y por extension de la herramienta awk de Unix Linux C Desde su version C 11 es posible utilizar expresiones regulares mediante la biblioteca estandar usando la cabecera lt regex gt 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 version 1 2 ie4 ns4 JavaScript tiene soporte integrado para expresiones regulares Perl es el lenguaje que hizo crecer a las expresiones regulares en el ambito de la programacion hasta llegar a lo que son hoy en dia 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 busquedas reemplazar cadenas y validar patrones Nota de las herramientas mencionadas con anterioridad se utilizan el EditPad Pro y el Net Framework para dar ejemplos tambien es posible utilizar las expresiones regulares con cualquier combinacion de las herramientas mencionadas Aunque en general las Expresiones Regulares utilizan un lenguaje comun en todas las herramientas las explicaciones practicas acerca de la utilizacion de las herramientas y los ejemplos de codigo deben ser interpretados de forma diferente Tambien 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 demas herramientas de programacion Cuando estos casos se den se hara notar en forma explicita para que el lector pueda buscar informacion respecto a estos detalles en fuentes adicionales En el futuro se incluiran adicionalmente ejemplos de otras herramientas y lenguajes de programacion Expresiones regulares como motor de busquedaLas expresiones regulares permiten encontrar porciones especificas de texto dentro de una cadena mas grande de caracteres Asi si es necesario encontrar el texto lote en la expresion el ocelote salto al lote contiguo cualquier motor de busqueda seria capaz de efectuar esta labor Sin embargo la mayoria de los motores de busqueda encontrarian tambien el fragmento lote de la palabra ocelote lo cual podria no ser el resultado esperado Algunos motores de busqueda 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 busqueda como un lenguaje que permite enviarle al motor de busqueda exactamente lo que deseamos encontrar en todos los casos sin necesidad de activar opciones adicionales al realizar la busqueda Expresiones regulares como lenguajePara especificar opciones dentro del texto a buscar se utiliza un lenguaje o convencion mediante el cual se le transmite al motor de busqueda 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 busqueda de expresiones regulares encuentre estos caracteres no los buscara en el texto en forma literal sino que buscara lo que los caracteres significan A estos caracteres se les llama algunas veces meta caracteres A continuacion se listan los principales meta caracteres y su funcion y como los interpreta el motor de expresiones regulares Descripcion de las expresiones regulares EditarEl punto Editar El punto se interpreta por el motor de busqueda como cualquier caracter es decir busca cualquier caracter incluyendo los saltos de linea Los motores de expresiones regulares tienen una opcion de configuracion que permite modificar este comportamiento En Net Framework se utiliza la opcion RegexOptions Singleline para especificar la opcion de que busque todos los caracteres incluidos el salto de linea 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 gotica puerta de getisboro goot el motor de busqueda encontrara gat got y por ultimo get Notese que el motor de busqueda no encuentra goot esto es porque el punto representa un solo caracter y unicamente uno Si es necesario que el motor encuentre tambien la expresion goot sera necesario utilizar repeticiones las cuales se explican mas adelante Aunque el punto es muy util para encontrar caracteres que no conocemos es necesario recordar que corresponde a cualquier caracter y que muchas veces esto no es lo que se requiere Es muy diferente buscar cualquier caracter que buscar cualquier caracter alfanumerico o cualquier digito o cualquier no digito o cualquier no alfanumerico Se debe tomar esto en cuenta antes de utilizar el punto y obtener resultados no deseados El signo de admiracion Editar Se utiliza para realizar una busqueda anticipada negativa La construccion de la expresion regular es con el par de parentesis el parentesis de apertura seguido de un signo de interrogacion y un signo de exclamacion Dentro de la busqueda tenemos la expresion regular Por ejemplo para excluir exactamente una palabra habra que utilizar palabra palabra La barra inversa o contrabarra Editar La barra inversa se utiliza para escapar el siguiente caracter de la expresion de busqueda de forma que este adquiera un significado especial o deje de tenerlo O sea la barra inversa no se utiliza nunca por si sola sino en combinacion con otros caracteres Al utilizarlo por ejemplo en combinacion con el punto este deja de tener su significado normal y se comporta como un caracter literal De la misma forma cuando se coloca la barra inversa seguida de cualquiera de los caracteres especiales que discutiremos a continuacion estos dejan de tener su significado especial y se convierten en caracteres de busqueda literal Como ya se menciono con anterioridad la barra inversa tambien puede darle significado especial a caracteres que no lo tienen A continuacion 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 linea vuelve a iniciar n Representa la nueva linea el caracter por medio del cual una linea da inicio Es necesario recordar que en Windows es necesaria una combinacion de r n para comenzar una nueva linea mientras que en Unix solamente se usa n y en Mac OS clasico se usa solamente r a Representa una campana o beep que se produce al imprimir este caracter e Representa la tecla Esc o Escape f Representa un salto de pagina v Representa un tabulador vertical x Se utiliza para representar caracteres ASCII o ANSI si conoce su codigo De esta forma si se busca el simbolo de derechos de autor y la fuente en la que se busca utiliza el conjunto de caracteres latin 1 es posible encontrarlo utilizando xA9 u Se utiliza para representar caracteres Unicode si se conoce su codigo u00A2 representa el simbolo 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 digito del 0 al 9 w Representa cualquier caracter alfanumerico s Representa un espacio en blanco D Representa cualquier caracter que no sea un digito del 0 al 9 W Representa cualquier caracter no alfanumerico S Representa cualquier caracter que no sea un espacio en blanco A Representa el inicio de la cadena No un caracter sino una posicion Z Representa el final de la cadena No un caracter sino una posicion b Marca la posicion de una palabra limitada por espacios en blanco puntuacion o el inicio final de una cadena B Marca la posicion entre dos caracteres alfanumericos o dos no alfanumericos Notas Utilidades como Charmap exe de Windows o gucharmap de GNOME permiten encontrar los codigos ASCII ANSI UNICODE para utilizarlos en Expresiones Regulares Algunos lenguajes como Java asignan su propio significado a la barra invertida por lo que debera repetirse para que sea considerada una expresion regular ejemplo String expresion d d para indicar el patron d d Los corchetes Editar La funcion de los corchetes en el lenguaje de las expresiones regulares es representar clases de caracteres o sea agrupar caracteres en grupos o clases Son utiles 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 nos es util para buscar cualquier caracter que represente un digito Sin embargo esta denominacion no incluye el punto que divide la parte decimal de un numero Para buscar cualquier caracter que representa un digito o un punto podemos utilizar la expresion regular d Como se hizo notar anteriormente dentro de los corchetes el punto representa un caracter literal y no un metacaracter por lo que no es necesario antecederlo con la barra inversa El unico caracter que es necesario anteceder con la barra inversa dentro de los corchetes es la propia barra inversa La expresion regular dA Fa f nos permite encontrar digitos hexadecimales Los corchetes nos permiten tambien encontrar palabras aun si estan escritas de forma erronea por ejemplo la expresion regular expresi oo n permite encontrar en un texto la palabra expresion 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 solo le dice al motor de busqueda que encuentre un solo caracter a la vez es decir que expresi oo n encontrara expresion o expresion La barra Editar Sirve para indicar una de varias opciones Por ejemplo la expresion regular a e encontrara cualquier a o e dentro del texto La expresion regular este oeste norte sur permitira encontrar cualquiera de los nombres de los puntos cardinales La barra se utiliza comunmente en conjunto con otros caracteres especiales El signo de dolar Editar Representa el final de la cadena de caracteres o el final de la linea si se utiliza el modo multi linea No representa un caracter en especial sino una posicion Si se utiliza la expresion regular el motor encontrara todos los lugares donde un punto finalice la linea lo que es util para avanzar entre parrafos El acento circunflejo Editar Este caracter 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 caracter individual el caracter representa el inicio de la cadena de la misma forma que el signo de dolar representa el final de la cadena Por tanto si se utiliza la expresion regular a z el motor encontrara todos los parrafos que den inicio con una letra minuscula Cuando se utiliza en conjunto con los corchetes de la siguiente forma w permite encontrar cualquier caracter que NO se encuentre dentro del grupo indicado La expresion indicada permite encontrar por ejemplo cualquier caracter que no sea alfanumerico o un espacio es decir busca todos los simbolos de puntuacion y demas caracteres especiales La utilizacion 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 unico digito d d d d d d d d permite validar una fecha en formato corto aunque no permite verificar si es una fecha valida ya que 99 99 9999 tambien seria valido en este formato la validacion completa de una fecha tambien es posible mediante expresiones regulares como se ejemplifica mas adelante Los parentesis Editar De forma similar que los corchetes los parentesis sirven para agrupar caracteres sin embargo existen varias diferencias fundamentales entre los grupos establecidos por medio de corchetes y los grupos establecidos por parentesis Los caracteres especiales conservan su significado dentro de los parentesis Los grupos establecidos con parentesis establecen una etiqueta o punto de referencia para el motor de busqueda que puede ser utilizada posteriormente como se denota mas adelante Utilizados en conjunto con la barra permite hacer busquedas opcionales Por ejemplo la expresion regular al este oeste norte sur de permite buscar textos que den indicaciones por medio de puntos cardinales mientras que la expresion regular este oeste norte sur encontraria este en la palabra esteban no pudiendo cumplir con este proposito Utilizados en conjunto con otros caracteres especiales que se detallan posteriormente ofrece funcionalidad adicional El signo de interrogacion Editar El signo de interrogacion tiene varias funciones dentro del lenguaje de las expresiones regulares La primera de ellas es especificar que una parte de la busqueda es opcional Por ejemplo la expresion regular ob scuridad permite encontrar tanto oscuridad como obscuridad En conjunto con los parentesis 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 menciono anteriormente los parentesis nos permiten establecer un punto de referencia para el motor de busqueda Sin embargo algunas veces no se desea utilizarlos con este proposito como en el ejemplo anterior Nov iembre ember En este caso el establecimiento de este punto de referencia que se detalla mas adelante representa una inversion inutil de recursos por parte del motor de busqueda Para evitarlo se puede utilizar el signo de pregunta de la siguiente forma Nov iembre ember Aunque el resultado obtenido sera el mismo el motor de busqueda no realizara una inversion inutil de recursos en este grupo sino que lo ignorara 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 parentesis definen grupos anonimos sin embargo el signo de pregunta en conjunto con los parentesis triangulares lt gt permite nombrar estos grupos de la siguiente forma lt Dia gt d d lt Mes gt d d lt Ano gt d d d d Con lo cual se le especifica al motor de busqueda que los primeros dos digitos encontrados llevaran la etiqueta Dia los segundos la etiqueta Mes y los ultimos cuatro digitos llevaran la etiqueta Ano NOTA a pesar de la complejidad y flexibilidad dada por los caracteres especiales estudiados hasta ahora en su mayoria nos permiten encontrar solamente un caracter a la vez o un grupo de caracteres a la vez Los metacaracteres enumerados en adelante permiten establecer repeticiones Las llaves Editar Comunmente las llaves son caracteres literales cuando se utilizan por separado en una expresion regular Para que adquieran su funcion de metacaracteres es necesario que encierren uno o varios numeros separados por coma y que esten colocados a la derecha de otra expresion regular de la siguiente forma d 2 Esta expresion le dice al motor de busqueda que encuentre dos digitos contiguos Utilizando esta formula podriamos convertir el ejemplo d d d d d d d d que servia para validar un formato de fecha en d 2 d 2 d 4 para una mayor claridad en la lectura de la expresion d 2 4 Esta forma anade un segundo numero separado por una coma el cual indica al motor de busqueda que como maximo debe aparecer 4 veces la expresion regular d Los posibles valores son d d minimo 2 repeticiones d d d tiene 3 repeticiones por lo tanto entra en el rango 2 4 d d d d maximo 4 repeticiones Nota aunque esta forma de encontrar elementos repetidos es muy util algunas veces no se conoce con claridad cuantas veces se repite lo que se busca o su grado de repeticion es variable En estos casos los siguientes metacaracteres son utiles El asterisco Editar El asterisco sirve para encontrar algo que se encuentra repetido 0 o mas veces Por ejemplo utilizando la expresion a zA Z d sera posible encontrar tanto H como H1 H01 H100 y H1000 es decir una letra seguida de un numero indefinido de digitos 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 patron que se busca De esta forma si se utiliza para encontrar cualquier cadena que se encuentre entre parentesis y se lo aplica sobre el texto Ver Fig 1 y Fig 2 se esperaria que el motor de busqueda encuentre los textos Fig 1 y Fig 2 sin embargo debido a esta caracteristica en su lugar encontrara el texto Fig 1 y Fig 2 Esto sucede porque el asterisco le dice al motor de busqueda que llene todos los espacios posibles entre los dos parentesis Para obtener el resultado deseado se debe utilizar el asterisco en conjunto con el signo de interrogacion de la siguiente forma Esto es equivalente a decirle al motor de busqueda que Encuentre un parentesis de apertura y luego encuentre cualquier secuencia de caracteres hasta que encuentre un parentesis de cierre El signo de suma Editar Se utiliza para encontrar una cadena que se encuentre repetida una o mas veces A diferencia del asterisco la expresion a zA Z d encontrara H1 pero no encontrara H Tambien es posible utilizar este metacaracter en conjunto con el signo de interrogacion para limitar hasta donde se efectua la repeticion Grupos anonimos Editar Los grupos anonimos se establecen cada vez que se encierra una expresion regular en parentesis por lo que la expresion lt a zA Z w gt define un grupo anonimo El motor de busqueda almacenara una referencia al grupo anonimo que corresponda a la expresion encerrada entre los parentesis La forma mas inmediata de utilizar los grupos que se definen es dentro de la misma expresion regular lo cual se realiza utilizando la barra inversa seguida del numero del grupo al que se desea hacer referencia de la siguiente forma lt a zA Z w gt lt 1 gt Esta expresion regular encontrara tanto la cadena lt span gt Esta lt span gt como la cadena lt b gt prueba lt b gt en el texto lt span gt Esta lt span gt es una lt b gt prueba lt b gt a pesar de que la expresion no contiene los literales font y B Otra forma de utilizar los grupos es en el lenguaje de programacion que se este utilizando Cada lenguaje tiene una forma distinta de acceder a los grupos Los ejemplos enumerados a continuacion utilizan las clases del Net Framework usando la sintaxis de C la cual puede facilmente adaptarse a VB Net o cualquier otro lenguaje del Framework o incluso Java o JavaScript Para utilizar el motor de busqueda 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 lt a zA Z w gt Luego asumiendo que el texto que se desea examinar con la expresion regular se encuentra en la variable sText podemos recorrer todas las instancias encontradas de la siguiente forma foreach Match CurrentMatch in TagParser Matches sText Codigo extra aqui Luego se puede utilizar la propiedad Groups de la clase Match para traer el resultado de la busqueda foreach Match CurrentMatch in TagParser Matches sText String sTagName CurrentMatch Groups 1 Value Grupos nominalesLos grupos nominales son aquellos a los que se les asigna un nombre dentro de la expresion regular para poder utilizarlos posteriormente Esto se hace de forma diferente en los distintos motores de busqueda a continuacion se explica como hacerlo en el motor del Net Framework Utilizando el ejemplo anterior es posible convertir lt a zA Z w gt en lt lt TagName gt a zA Z w gt Para encontrar etiquetas HTML Notese el signo de pregunta y el texto TagName encerrado entre parentesis triangulares seguido de este Para utilizar este ejemplo en el Net Framework es posible utilizar el siguiente codigo Regex TagParser new Regex lt lt TagName gt a zA Z w gt 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 lt lt TagName gt a zA Z w lt Attributes gt gt para encontrar no solo el nombre del tag HTML sino tambien sus atributos de la siguiente forma Regex TagParser new Regex lt lt TagName gt a zA Z w lt Attributes gt gt foreach Match CurrentMatch in TagParser Matches sText String sTagName CurrentMatch Groups TagName Value String sAttributes CurrentMatch Groups Attributes Value Pero es posible ir mucho mas alla de la siguiente forma lt lt TagName gt a zA Z w r n lt Attribute gt w r n lt Value gt w r n gt Esta expresion permite encontrar el nombre de la etiqueta el nombre del atributo y su valor Sin embargo una etiqueta HTML puede tener mas de un atributo Este puede resolverse utilizando repeticiones de la siguiente forma lt lt TagName gt a zA Z w r n lt Attribute gt w r n lt Value gt w r n gt Y en el codigo puede utilizarse de la siguiente forma Regex TagParser new Regex lt lt TagName gt a zA Z w r n lt Attribute gt w r n lt Value gt w r n gt 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 expresion regular como esta lt lt TagName gt a zA Z w r n lt Attribute gt w r n lt Value gt w r n gt lt Content gt lt 1 gt La cual permitiria encontrar el nombre de la etiqueta sus atributos valores y el contenido de esta todo con una sola expresion regular Referencias Editar Mitkov Ruslan 2003 The Oxford Handbook of Computational Linguistics en ingles Oxford University Press ISBN 978 0 19 927634 9 Lawson Mark V 17 de septiembre de 2003 Finite Automata en ingles CRC Press ISBN 978 1 58488 255 8 What Regular Expressions Are Exactly Terminology html en ingles 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 EditarManual sobre Expresiones Regulares en ingles Prueba y explicacion de expresiones regulares en linea en ingles Tutorial de expresiones regulares en Python en ingles Modo de empleo de expresiones regulares en Python en ingles Learn about regular expressions in Python Paginas de manual Perl sobre exp reg perlrequick Guia rapida de las expresiones regulares perlretut Tutorial de expresiones regulares perlre Manual sobre expresiones regulares en Perl perlrebackslash Secuencias de escape en expresiones regulares en Perl perlrecharclass Clases de caracteres en expresiones regulares Perl perlreref Referencia de expresiones regulares en Perl Datos Q185612 Multimedia Regex Obtenido de https es wikipedia org w index php title Expresion regular amp oldid 139047843, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos