Está en la página 1de 8

Expresin regular Una expresin regular, a menudo llamada tambin patrn, es una expresin que describe un conjunto de cadenas

sin enumerar sus elementos. Por ejemplo, el grupo formado p or las cadenas Handel, Hndel y Haendel se describe mediante el patrn "H(a ae)ndel" . La mayora de las formalizaciones proporcionan los siguientes constructores: una expresin regular es una forma de representar a los lenguajes regulares (finitos o infinitos) y se construye utilizando caracteres del alfabeto sobre el cual se define el lenguaje. Especficamente, las expresiones regulares se construyen utili zando los operadores unin, concatenacin y clausura de Kleene. Adems cada expresin re gular tiene un autmata finito asociado. Alternacin Una barra vertical separa las alternativas. Por ejemplo, "marrn castao" ca sa con marrn o castao. Cuantificacin Un cuantificador tras un carcter especifica la frecuencia con la que ste p uede ocurrir. Los cuantificadores ms comunes son +,? y *: + El signo ms indica que el carcter al que sigue debe aparecer al menos una vez. Por ejemplo, "ho+la" describe el conjunto infinito hola, hoola, hooola, hoo oola, etctera. ? El signo de interrogacin indica que el carcter al que sigue puede aparecer como mucho una vez. Por ejemplo, "ob?scuro" casa con oscuro y obscuro. * El asterisco indica que el carcter que lo precede puede aparecer cero, un a, o ms veces. Por ejemplo, "0*42" casa con 42, 042, 0042, 00042, etctera. Agrupacin Los parntesis pueden usarse para definir el mbito y precedencia de los dems operadores. Por ejemplo, "(p m)adre" es lo mismo que "padre madre", y "(des)?am or" casa con amor y con desamor. Los constructores pueden combinarse libremente dentro de la misma expresin, por l o que "H(ae? )ndel" equivale a "H(a ae )ndel". La sintaxis precisa de las expresiones regulares cambia segn las herramientas y a plicaciones consideradas, y se describe con ms detalle a continuacin. Su utilidad ms obvia es la de describir un conjunto de cadenas, lo que resulta de utilidad en editores de texto y aplicaciones para buscar y manipular textos. Mu chos lenguajes de programacin admiten el uso de expresiones regulares con este fi n. Por ejemplo, Perl tiene un potente motor de expresiones regulares directament e incluido en su sintaxis. Las herramientas proporcionadas por las distribucione s de Unix (incluyendo el editor sed y el filtro grep) fueron las primeras en pop ularizar el concepto de expresin regular. Contenido 1 Aplicaciones 2 Las expresiones regulares en programacin 3 Descripcin de las expresiones regulares 3.1 El Punto "." 3.2 La barra inversa o contrabarra "\" 3.3 Los corchetes "[ ]" 3.4 La barra " " 3.5 El signo de dlar "$" 3.6 El acento circunflejo "^" 3.7 Los parntesis "()" 3.8 El signo de interrogacin "?" 3.9 Las llaves "{}"

3.10 El asterisco "*" 3.11 El signo de suma "+" 3.12 Grupos annimos 4 Enlaces externos [editar] Aplicaciones Numerosos editores de texto y otras utilidades utilizan expresiones regulares pa ra buscar y reemplazar patrones en un texto. [editar] Las expresiones regulares en programacin Nota: Para el entendimiento completo de esta seccin es necesario poseer c onocimientos generales acerca de lenguajes de programacin o programacin en general . En el rea de la programacin las expresiones regulares son un mtodo por medio del cu al se pueden realizar bsquedas dentro de cadenas de caracteres. Sin importar si l a bsqueda requerida es de dos caracteres en una cadena de 10 o si es necesario en contrar todas las apariciones de un patrn definido de caracteres en un archivo de millones de caracteres, las expresiones regulares proporcionan una solucin para el problema. Adicionalmente, un uso derivado de la bsqueda de patrones es la vali dacin de un formato especfico en una cadena de caracteres dada, como por ejemplo f echas o identificadores. Para poder utilizar las expresiones regulares al programar es necesario tener ac ceso a un motor de bsqueda con la capacidad de utilizarlas. Es posible clasificar los motores disponibles en dos tipos: Motores para el programador y Motores par a el usuario final. Motores para el usuario final: son programas que permiten realizar bsquedas sobre el contenido de un archivo o sobre un texto extrado y colocado en el programa. E stn diseados para permitir al usuario realizar bsquedas avanzadas usando este mecan ismo, sin embargo es necesario aprender a redactar expresiones regulares adecuad as para poder utilizarlos eficientemente. stos son algunos de los programas dispo nibles: grep: programa de los sistemas operativos Unix/Linux PowerGrep: versin de grep para los sistemas operativos Windows RegexBuddy: ayuda a crear las expresiones regulares en forma interactiva y luego le permite al usuario usarlas y guardarlas. EditPad Pro: permite realizar bsquedas con expresiones regulares sobre ar chivos y las muestra por medio de cdigo de colores para facilitar su lectura y co mprensin. Motores para el programador: permiten automatizar el proceso de bsqueda de modo q ue sea posible utilizarlo muchas veces para un propsito especfico. Estas son algun as de las herramientas de programacin disponibles que ofrecen motores de bsqueda c on soporte a expresiones regulares: 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 versin 1.2 (ie4+, ns4+) JavaScript tiene sopor te integrado para expresiones regulares. Perl: es el lenguaje que hizo crecer a las expresiones regulares en el mb ito de la programacin hasta llegar a lo que son hoy en da. PCRE: biblioteca de ExReg para C, C++ y otros lenguajes que puedan utili zar bibliotecas dll (Visual Basic 6 por ejemplo). PHP: tiene dos tipos diferentes de expresiones regulares disponibles par a el programador, aunque la variante POSIX (ereg) va a ser desechada en PHP 6. Python: lenguaje de "scripting" popular con soporte a Expresiones Regula res. .Net Framework: provee un conjunto de clases mediante las cuales es posi ble utilizar expresiones regulares para hacer bsquedas, reemplazar cadenas y vali dar patrones. Nota: de las herramientas mencionadas con anterioridad se utilizan el EditPad Pr

o y el .Net Framework para dar ejemplos, aunque es posible utilizar las expresio nes regulares con cualquier combinacin de las herramientas mencionadas. Aunque en general las Expresiones Regulares utilizan un lenguaje comn en todas las herrami entas, las explicaciones prcticas acerca de la utilizacin de las herramientas y lo s ejemplos de cdigo deben ser interpretados de forma diferente. Tambin es necesari o hacer notar que existen algunos detalles de sintaxis de las expresiones regula res que son propietarios del .Net Framework que se utilizan en forma diferente e n las dems herramientas de programacin. Cuando estos casos se den se har notar en f orma explcita para que el lector pueda buscar informacin respecto a estos detalles en fuentes adicionales. En el futuro se incluirn adicionalmente ejemplos de otra s herramientas y lenguajes de programacin. Expresiones regulares como motor de bsqueda Las expresiones regulares permiten encontrar porciones especficas de texto dentro de una cadena ms grande de caracteres. As, si es necesario encontrar el texto "lo te" en la expresin "el ocelote salt al lote contiguo" cualquier motor de bsqueda se ra capaz de efectuar esta labor. Sin embargo, la mayora de los motores de bsqueda e ncontraran tambin el fragmento "lote" de la palabra "ocelote", lo cual podra no ser el resultado esperado. Algunos motores de bsqueda permiten adicionalmente especi ficar que se desea encontrar solamente palabras completas, solucionando este pro blema. Las expresiones regulares permiten especificar todas estas opciones adici onales y muchas otras sin necesidad de configurar opciones adicionales, sino uti lizando el mismo texto de bsqueda como un lenguaje que permite enviarle al motor de bsqueda exactamente lo que deseamos encontrar en todos los casos, sin necesida d de activar opciones adicionales al realizar la bsqueda. Expresiones regulares como lenguaje Para especificar opciones dentro del texto a buscar se utiliza un lenguaje o con vencin mediante el cual se le transmite al motor de bsqueda el resultado que se de sea obtener. Este lenguaje le da un significado especial a una serie de caracter es. Por lo tanto cuando el motor de bsqueda de expresiones regulares encuentre es tos 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-c aracteres". A continuacin se listan los principales meta-caracteres y su funcin y como los interpreta el motor de expresiones regulares. [editar] Descripcin de las expresiones regulares [editar] El Punto "."

El punto es interpretado por el motor de bsqueda como cualquier carcter excepto lo s caracteres que representan un salto de lnea, a menos que se le especifique esto al motor de Expresiones Regulares. Por lo tanto si esta opcin se deshabilita en el motor de bsqueda que se utilice, el punto le dir al motor que encuentre cualqui er carcter incluyendo los saltos de lnea. En la herramienta EditPad Pro esto se ha ce por medio de la opcin "punto corresponde a nueva lnea" en las opciones de bsqued a. En .Net Framework se utiliza la opcin RegexOptions. Singleline al efectuar la bsqueda o crear la expresin regular. El punto se utiliza de la siguiente forma: Si se le dice al motor de RegEx que b usque "g.t" en la cadena "el gato de piedra en la gtica puerta de getisboro goot" el motor de bsqueda encontrar "gat", "gt" y por ltimo "get". Ntese que el motor de b queda no encuentra "goot"; esto es porque el punto representa un solo carcter y ni camente uno. Si es necesario que el motor encuentra tambin la expresin "goot", ser necesario utilizar repeticiones, las cuales se explican ms adelante. Aunque el punto es muy til para encontrar caracteres que no conocemos, es necesar io recordar que corresponde a cualquier carcter y que muchas veces esto no es lo que se requiere. Es muy diferente buscar cualquier carcter que buscar cualquier c arcter alfanumrico o cualquier dgito o cualquier no-dgito o cualquier no-alfanumrico. Se debe tomar esto en cuenta antes de utilizar el punto y obtener resultados no deseados.

[editar] La barra inversa o contrabarra "\" Se utiliza para "marcar" el siguiente carcter de la expresin de bsqueda de forma qu e este adquiera un significado especial o deje de tenerlo. O sea, la barra inver sa no se utiliza nunca por s sola, sino en combinacin con otros caracteres. Al uti lizarlo por ejemplo en combinacin con el punto "\." este deja de tener su signifi cado normal y se comporta como un carcter literal. De la misma forma, cuando se coloca la barra inversa seguida de cualquiera de lo s caracteres especiales que discutiremos a continuacin, estos dejan de tener su s ignificado especial y se convierten en caracteres de bsqueda literal. Como ya se mencion con anterioridad, la barra inversa tambin puede darle significa do especial a caracteres que no lo tienen. A continuacin 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 lnea vuelve a iniciar. \n Representa la "nueva lnea" el carcter por medio del cual una lnea da ini cio. Es necesario recordar que en Windows es necesaria una combinacin de \r\n par a comenzar una nueva lnea, mientras que en Unix solamente se usa \n y en Mac_OS c lsico se usa solamente \r. \a Representa una "campana" o "beep" que se produce al imprimir este carc ter. \e Representa la tecla "Esc" o "Escape" \f Representa un salto de pgina \v Representa un tabulador vertical \x Se utiliza para representar caracteres ASCII o ANSI si conoce su cdigo . De esta forma, si se busca el smbolo de derechos de autor y la fuente en la que se busca utiliza el conjunto de caracteres Latin-1 es posible encontrarlo utili zando "\xA9". \u Se utiliza para representar caracteres Unicode si se conoce su cdigo. "\u00A2" representa el smbolo de centavos. No todos los motores de Expresiones Re gulares soportan Unicode. El .Net Framework lo hace, pero el EditPad Pro no, por ejemplo. \d Representa un dgito del 0 al 9. \w Representa cualquier carcter alfanumrico. \s Representa un espacio en blanco. \D Representa cualquier carcter que no sea un dgito del 0 al 9. \W Representa cualquier carcter no alfanumrico. \S Representa cualquier carcter que no sea un espacio en blanco. \A Representa el inicio de la cadena. No un carcter sino una posicin. \Z Representa el final de la cadena. No un carcter sino una posicin. \b Marca el inicio y el final de una palabra. \B Marca la posicin entre dos caracteres alfanumricos o dos no-alfanumricos . Notas: Utilidades como Charmap.exe de Windows o gucharmap de GNOME permiten enc ontrar los cdigos ASCII/ANSI/UNICODE para utilizarlos en Expresiones Regulares. Algunos lenguajes, como Java, asignan su propio significado a la barra i nvertida, por lo que deber repetirse para que sea considerada una expresin regular (ej. String expresion="\\d.\\d" para indicar el patrn \d.\d). [editar] Los corchetes "[ ]" La funcin de los corchetes en el lenguaje de las expresiones regulares es represe ntar "clases de caracteres", o sea, agrupar caracteres en grupos o clases. Son ti les cuando es necesario buscar uno de un grupo de caracteres. Dentro de los corc hetes es posible utilizar el guion "-" para especificar rangos de caracteres. Ad icionalmente, los metacaracteres pierden su significado y se convierten en liter ales cuando se encuentran dentro de los corchetes. Por ejemplo, como vimos en la entrega anterior "\d" nos es til para buscar cualquier carcter que represente un

dgito. Sin embargo esta denominacin no incluye el punto "." que divide la parte de cimal de un nmero. Para buscar cualquier carcter que representa un dgito o un punto podemos utilizar la expresin regular "[\d.]". Como se hizo notar anteriormente, dentro de los corchetes, el punto representa un carcter literal y no un metacarcte r, por lo que no es necesario antecederlo con la barra inversa. El nico carcter qu e es necesario anteceder con la barra inversa dentro de los corchetes es la prop ia barra inversa. La expresin regular "[\dA-Fa-f]" nos permite encontrar dgitos he xadecimales. Los corchetes nos permiten tambin encontrar palabras an si estn escrit as de forma errnea, por ejemplo, la expresin regular "expresi[o]n" permite encontra r en un texto la palabra "expresin" aunque se haya escrito con o sin tilde. Es ne cesario aclarar que sin importar cuantos caracteres se introduzcan dentro del gr upo por medio de los corchetes, el grupo slo le dice al motor de bsqueda que encue ntre un solo carcter a la vez, es decir, que "expresi[o]n" no encontrar "expresioon " o "expresion". [editar] La barra " " Sirve para indicar una de varias opciones. Por ejemplo, la expresin regular "a e" encontrar cualquier "a" o "e" dentro del texto. La expresin regular "este oeste n orte sur" permitir encontrar cualquiera de los nombres de los puntos cardinales. La barra se utiliza comnmente en conjunto con otros caracteres especiales. [editar] El signo de dlar "$" Representa el final de la cadena de caracteres o el final de la lnea, si se utili za el modo multi-lnea. No representa un carcter en especial sino una posicin. Si se utiliza la expresin regular "\.$" el motor encontrar todos los lugares donde un p unto finalice la lnea, lo que es til para avanzar entre prrafos. [editar] El acento circunflejo "^" Este carcter tiene una doble funcionalidad, que difiere cuando se utiliza individ ualmente y cuando se utiliza en conjunto con otros caracteres especiales. En pri mer lugar su funcionalidad como carcter individual: el carcter "^" representa el i nicio de la cadena (de la misma forma que el signo de dlar "$" representa el fina l de la cadena). Por tanto, si se utiliza la expresin regular "^[a-z]" el motor e ncontrar todos los prrafos que den inicio con una letra minscula. Cuando se utiliza en conjunto con los corchetes de la siguiente forma "[^\w ]" permite encontrar cualquier carcter que NO se encuentre dentro del grupo indicado. La expresin indic ada permite encontrar, por ejemplo, cualquier carcter que no sea alfanumrico o un espacio, es decir, busca todos los smbolos de puntuacin y dems caracteres especiale s. La utilizacin en conjunto de los caracteres especiales "^" y "$" permite realizar validaciones en forma sencilla. Por ejemplo "^\d$" permite asegurar que la cade na a verificar representa un nico dgito, "^\d\d/\d\d/\d\d\d\d$" permite validar un a fecha en formato corto, aunque no permite verificar si es una fecha vlida, ya q ue 99/99/9999 tambin sera vlido en este formato; la validacin completa de una fecha tambin es posible mediante expresiones regulares, como se ejemplifica ms adelante. [editar] Los parntesis "()" De forma similar que los corchetes, los parntesis sirven para agrupar caracteres, sin embargo existen varias diferencias fundamentales entre los grupos estableci dos por medio de corchetes y los grupos establecidos por parntesis: Los caracteres especiales conservan su significado dentro de los parntesi s. Los grupos establecidos con parntesis establecen una "etiqueta" o "punto de referencia" para el motor de bsqueda que puede ser utilizada posteriormente co mo se denota ms adelante. Utilizados en conjunto con la barra " " permite hacer bsquedas opcionales

. Por ejemplo la expresin regular "al (este oeste norte sur) de" permite buscar t extos que den indicaciones por medio de puntos cardinales, mientras que la expre sin regular "este oeste norte sur" encontrara "este" en la palabra "esteban", no p udiendo cumplir con este propsito. Utilizado en conjunto con otros caracteres especiales que se detallan po steriormente, ofrece funcionalidad adicional. [editar] El signo de interrogacin "?" El signo de pregunta tiene varias funciones dentro del lenguaje de las expresion es regulares. La primera de ellas es especificar que una parte de la bsqueda es o pcional. Por ejemplo, la expresin regular "ob?scuridad" permite encontrar tanto " oscuridad" como "obscuridad". En conjunto con los parentesis redondos permite es pecificar que un conjunto mayor de caracteres es opcional; por ejemplo "Nov(\. i embre ember)?" permite encontrar tanto "Nov" como "Nov.", "Noviembre" y "Novembe r". Como se mencion anteriormente los parntesis nos permiten establecer un "punto de referencia" para el motor de bsqueda, sin embargo, algunas veces, no se desea utilizarlos con este propsito, como en el ejemplo anterior "Nov(\. iembre ember)? ". En este caso el establecimiento de este punto de referencia (que se detalla ms adelante) representa una inversin intil de recursos por parte del motor de bsqueda . Para evitar se puede utilizar el signo de pregunta de la siguiente forma: "Nov (?:\. iembre ember)?". Aunque el resultado obtenido ser el mismo, el motor de bsqu eda no realizar una inversin intil de recursos en este grupo, sino que lo ignorar. C uando no sea necesario reutilizar el grupo, es aconsejable utilizar este formato . De forma similar, es posible utilizar el signo de pregunta con otro significad o: Los parntesis definen grupos "annimos", sin embargo el signo de pregunta en con junto con los parntesis triangulares "<>" permite "nombrar" estos grupos de la si guiente forma: "^(?<Da>\d\d)/(?<Mes>\d\d)/(?<Ao>\d\d\d\d)$"; Con lo cual se le esp ecifica al motor de bsqueda que los primeros dos dgitos encontrados llevarn la etiq ueta "Da", los segundos la etiqueta "Mes" y los ltimos cuatro dgitos llevarn la etiq ueta "Ao". Nota: a pesar de la complejidad y flexibilidad dada por los caracteres especiale s estudiados hasta ahora, en su mayora nos permiten encontrar solamente un carcter a la vez, o un grupo de caracteres a la vez. Los metacaracteres enumerados en a delante permiten establecer repeticiones. [editar] Las llaves "{}" Comnmente las llaves son caracteres literales cuando se utilizan por separado en una expresin regular. Para que adquieran su funcin de metacaracteres es necesario que encierren uno o varios nmeros separados por coma y que estn colocados a la der echa de otra expresin regular de la siguiente forma: "\d{2}" Esta expresin le dice al motor de bsqueda que encuentre dos dgitos contiguos. Utilizando esta frmula pod ramos convertir el ejemplo "^\d\d/\d\d/\d\d\d\d$" que serva para validar un format o de fecha en "^\d{2}/\d{2}/\d{4}$" para una mayor claridad en la lectura de la expresin. Nota: aunque esta forma de encontrar elementos repetidos es muy til, algunas vece s no se conoce con claridad cuantas veces se repite lo que se busca o su grado d e repeticin es variable. En estos casos los siguientes metacaracteres son tiles. [editar] El asterisco "*" El asterisco sirve para encontrar algo que se encuentra repetido 0 o ms veces. Po r ejemplo, utilizando la expresin "[a-zA-Z]\d*" ser posible encontrar tanto "H" co mo "H1", "H01", "H100" y "H1000", es decir, una letra seguida de un nmero indefin ido de dgitos. Es necesario tener cuidado con el comportamiento del asterisco, ya que ste, por defecto, trata de encontrar la mayor cantidad posible de caracteres que correspondan con el patrn que se busca. De esta forma si se utiliza "\(.*\)" para encontrar cualquier cadena que se encuentre entre parntesis y se lo aplica sobre el texto "Ver (Fig. 1) y (Fig. 2)" se esperara que el motor de bsqueda encue

ntre los textos "(Fig. 1)" y "(Fig. 2)", sin embargo, debido a esta caracterstica , en su lugar encontrar el texto "(Fig. 1) y (Fig. 2)". Esto sucede porque el ast erisco le dice al motor de bsqueda que llene todos los espacios posibles entre lo s dos parntesis. Para obtener el resultado deseado se debe utilizar el asterisco en conjunto con el signo de pregunta de la siguiente forma: "\(.*?\)" Esto es eq uivalente a decirle al motor de bsqueda que "Encuentre un parntesis de apertura y luego encuentre cualquier secuencia de caracteres hasta que encuentre un parntesi s de cierre". [editar] El signo de suma "+" Se utiliza para encontrar una cadena que se encuentre repetida 1 o ms veces. A di ferencia del asterisco, la expresin "[a-zA-Z]\d+" encontrar "H1" pero no encontrar "H". Tambin es posible utilizar este metacarcter en conjunto con el signo de pregu nta para limitar hasta donde se efecta la repeticin. [editar] Grupos annimos Los grupos annimos se establecen cada vez que se encierra una expresin regular en parntesis, por lo que la expresin "<([a-zA-Z]\w*?)>" define un grupo annimo que ten dr como resultado que el motor de bsqueda almacenar una referencia al texto que cor responda a la expresin encerrada entre los parntesis. La forma ms inmediata de utilizar los grupos que se definen es dentro de la misma expresin regular, lo cual se realiza utilizando la barra inversa "\" seguida del nmero del grupo al que se desea hacer referencia de la siguiente forma: "<([a-zA -Z]\w*?)>.*?</\1>" Esta expresin regular encontrar tanto la cadena "Esta" como la cadena "prueba" en el texto "Esta es una prueba" a pesar de que la expresin no co ntiene los literales "font" y "B". Otra forma de utilizar los grupos es en el lenguaje de programacin que se est util izando. Cada lenguaje tiene una forma distinta de acceder a los grupos. Los ejem plos enumerados a continuacin utilizan las clases del .Net Framework, usando la s intxis de C# (la cual puede fcilmente adaptarse a VB .Net o cualquier otro lenguaj e del Framework o incluso Java o JavaScript). Para utilizar el motor de bsqueda 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 expresin regular se enc uentra en la variable "sText" podemos recorrer todas las instancias encontradas de la siguiente forma: foreach(Match CurrentMatch in _TagParser.Matches(sText)){ // ----- Cdigo extra aqu ----} Luego se puede utilizar la propiedad Groups de la clase Match para traer el resu ltado de la bsqueda: 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 l a expresin regular para poder utilizarlos posteriormente. Esto se hace de forma d iferente en los distintos motores de bsqueda, a continuacin se explica como hacerl o en el motor del .Net Framework. Utilizando el ejemplo anterior es posible convertir "<([a-zA-Z]\w*?)>" en "<(?<T agName>[a-zA-Z]\w*?)>" Para encontrar etiquetas HTML. Ntese el signo de pregunta

y el texto "TagName" encerrado entre parentesis triangulares, seguido de este. P ara utilizar este ejemplo en el .Net Framework es posible utilizar el siguiente cdigo: 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 defi nir algo como: "<(?<TagName>[a-zA-Z]\w*?)?(?<Attributes>.*?)>" para encontrar no solo el nombre del tag HTML sino tambin 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 ms all de la siguiente forma: "<?(?<TagName>[a-zA-Z][\w\r\n]*?) ?(?:(?<Attribute>[\w-\r\n]*?)='?"?(?<Value> [\w-:;,\./= \r\n]*?)'?"? ?)>" Esta expresin permite encontrar el nombre de la etiqueta, el nombre del atributo y su valor. Sin embargo, una etiqueta HTML puede tener ms de un atributo. Este puede resolver se utilizando repeticiones de la siguiente forma: "<?(?<TagName>[a-zA-Z][\w\r\n]*?) ?(?:(?<Attribute>[\w-\r\n]*?)='?"?(?<Value> [\w-:;,\./= \r\n]*?)'?"? ?)*?>" Y en el cdigo 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"]. Captur es){ AttributesCollection. Add(CurrentCapture. Value) } foreach(Capture CurrentCapture in CurrentMatch. Groups["value"]. Captures){ ValuesCollection. Add(CurrentCapture. Value) } } Es posible profundizar utilizando una expresin regular como esta: "<?(?<TagName>[a-zA-Z][\w\r\n]*?) ?(?:(?<Attribute>[\w-\r\n]*?)='?"?(?<Value> [\w-:;,\./= \r\n]*?)'?"? ?)*?>(?<Content>.*?)</\1>" La cual permitira encontrar el nombre de la etiqueta, sus atributos, valores y el contenido de esta, todo con una sola expresin regular.

También podría gustarte