Sei sulla pagina 1di 26

Expresin regular

Una expresin regular, tambin conocida como regex, regexp1 y a menudo


llamada una expresin racional,2 3 es, en la ciencia computacional terica y la
teora de lenguaje formal, una secuencia de caracteres que forma un patrn de
bsqueda, principalmente utilizada para la bsqueda de patrones de cadenas de
caracteres u operaciones de sustituciones. Por ejemplo, el grupo formado por las
cadenas Handel, Hndel y Haendel se describe con el patrn "H(a||ae)ndel". La
mayora de las formalizaciones proporcionan los siguientes constructores: una
expresin 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.

En informtica, las expresiones regulares proporcionan una manera muy flexible


de buscar o reconocer cadenas de texto.

Construccin de una expresin regular


Especficamente, las expresiones regulares se construyen utilizando los
operadores unin, concatenacin y clausura de Kleene. Toda expresin regular
tiene algn autmata finito asociado.

Alternacin
Una barra vertical separa las alternativas. Por ejemplo, "marrn|castao" se
corresponde con marrn o castao.
Cuantificacin
Un cuantificador tras un carcter especfica la frecuencia con la que ste puede
ocurrir. Los cuantificadores ms comunes son "?", "+" y "*":
?
El signo de interrogacin indica que el carcter que le precede puede aparecer
como mucho una vez. Por ejemplo, "ob?scuro" se corresponde con oscuro y
obscuro.
+
El signo ms indica que el carcter que le precede debe aparecer al menos una
vez. Por ejemplo, "ho+la" describe el conjunto infinito hola, hoola, hooola, hoooola,
etctera.
*
El asterisco indica que el carcter que le precede puede aparecer cero, una, o ms
veces. Por ejemplo, "0*42" se corresponde 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)?
amor" se corresponde con amor y con desamor.

Los constructores pueden combinarse libremente dentro de la misma expresin,


por lo que "H(ae?|)ndel" equivale a "H(a|ae|)ndel".

La sintaxis precisa de las expresiones regulares cambia segn las herramientas y


aplicaciones consideradas, y se describe con ms detalle a continuacin.

Aplicaciones
Su utilidad ms obvia es la de describir un conjunto de cadenas para una
determinada funcin, resultando de utilidad en editores de texto y otras
aplicaciones informticas 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 expresin regular entre usuarios no
programadores, aunque ya era familiar entre los programadores.

Inicialmente, este reconocimiento de cadenas se programaba para cada aplicacin


sin mecanismo alguno inherente al lenguaje de programacin pero, con el tiempo,
se ha ido incorporado el uso de expresiones regulares para facilitar programar la
deteccin 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 especficas sin incorporarlo a su sintaxis.

Las expresiones regulares en programacin


Nota: Para el entendimiento completo de esta seccin es necesario poseer
conocimientos 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 cual se pueden realizar bsquedas dentro de cadenas de caracteres. Sin
importar la amplitud de la bsqueda requerida de un patrn definido de caracteres,
las expresiones regulares proporcionan una solucin prctica al problema.
Adicionalmente, un uso derivado de la bsqueda de patrones es la validacin de
un formato especfico 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 bsqueda con la capacidad de utilizarlas. Es posible
clasificar los motores disponibles en dos tipos segn su uso: motores para el
programador y motores para 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. Estn diseados para permitir al usuario realizar bsquedas 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 modificacin


de la salida.

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 archivos
y las muestra por medio de cdigo de colores para facilitar su lectura y
comprensin.

Motores para el programador: permiten automatizar el proceso de bsqueda de


modo que sea posible utilizarlo muchas veces para un propsito especfico. Estas
son algunas de las herramientas de programacin disponibles que ofrecen
motores de bsqueda con soporte a expresiones regulares:

AWK: Forma una parte esencial del lenguaje y por extensin de la herramienta
awk de Unix/Linux

C++: Desde su versin C++11 es posible utilizar expresiones regulares mediante la


biblioteca estndar, 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 versin 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


programacin hasta llegar a lo que son hoy en da.

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
librera <regex>.

.Net Framework: provee un conjunto de clases mediante las cuales es posible


utilizar expresiones regulares para hacer bsquedas, reemplazar cadenas y validar
patrones.

Nota: de las herramientas mencionadas con anterioridad se utilizan el EditPad Pro


y el .Net Framework para dar ejemplos, aunque es posible utilizar las expresiones
regulares con cualquier combinacin de las herramientas mencionadas. Aunque
en general las Expresiones Regulares utilizan un lenguaje comn en todas las
herramientas, las explicaciones prcticas acerca de la utilizacin de las
herramientas y los ejemplos de cdigo deben ser interpretados de forma diferente.
Tambin 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 dems herramientas de programacin. Cuando estos casos
se den se har notar en forma explcita para que el lector pueda buscar
informacin respecto a estos detalles en fuentes adicionales. En el futuro se
incluirn adicionalmente ejemplos de otras 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 "lote" en la expresin "el ocelote salt al lote contiguo" cualquier motor de
bsqueda sera capaz de efectuar esta labor. Sin embargo, la mayora de los
motores de bsqueda encontraran tambin el fragmento "lote" de la palabra
"ocelote", lo cual podra no ser el resultado esperado. Algunos motores de
bsqueda 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
bsqueda como un lenguaje que permite enviarle al motor de bsqueda
exactamente lo que deseamos encontrar en todos los casos, sin necesidad 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


convencin mediante el cual se le transmite al motor de bsqueda 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 bsqueda 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 continuacin se listan los principales meta-caracteres y
su funcin y cmo los interpreta el motor de expresiones regulares.

Descripcin de las expresiones regulares


El punto "."
El punto se interpreta por el motor de bsqueda como "cualquier carcter", es
decir, busca cualquier carcter SIN incluir los saltos de lnea. Los motores de
Expresiones regulares tienen una opcin de configuracin que permite modificar
este comportamiento. En .Net Framework se utiliza la opcin
RegexOptions.Singleline para especificar la opcin de que busque todos los
caracteres incluidos el salto de lnea (\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 gtica puerta de getisboro goot"
el motor de bsqueda encontrar "gat", "gt" y por ltimo "get". Ntese que el
motor de bsqueda no encuentra "goot"; esto es porque el punto representa un
solo carcter y nicamente uno. Si es necesario que el motor encuentre 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


necesario 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 carcter 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.

El signo de admiracin "!"


Se utiliza para realizar una "bsqueda anticipada negativa". La construccin de la
expresin regular es con el par de parntesis, el parntesis de apertura seguida de
un signo de interrogacin y un signo de exclamacin. Dentro de la bsqueda
tenemos la expresin regular. Por ejemplo, para excluir exactamente una palabra,
habr que utilizar "^(palabra.+|(?!palabra).*)$"

La barra inversa o antibarra "\"


Se utiliza para escapar el siguiente carcter de la expresin de bsqueda 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 combinacin con otros caracteres. Al
utilizarlo por ejemplo en combinacin con el punto "\." este deja de tener su
significado normal y se comporta como un carcter literal.

De la misma forma, cuando se coloca la barra inversa seguida de cualquiera de


los caracteres especiales que discutiremos a continuacin, estos dejan de tener su
significado especial y se convierten en caracteres de bsqueda literal.
Como ya se mencion con anterioridad, la barra inversa tambin puede darle
significado 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 inicio.
Es necesario recordar que en Windows es necesaria una combinacin de \r\n para
comenzar una nueva lnea, mientras que en Unix solamente se usa \n y en
Mac_OS clsico se usa solamente \r.

\a Representa una "campana" o "beep" que se produce al imprimir este


carcter.

\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 utilizando
"\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
Regulares 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 la posicin de una palabra limitada por espacios en blanco, puntuacin
o el inicio/final de una cadena.

\B Marca la posicin entre dos caracteres alfanumricos o dos no-


alfanumricos.

Notas:

Utilidades como Charmap.exe de Windows o gucharmap de GNOME permiten


encontrar los cdigos 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 expresin regular (ej.
String expresion="\\d.\\d" para indicar el patrn \d.\d).

Los corchetes "[ ]"


La funcin 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 carcter que
represente un dgito. Sin embargo esta denominacin no incluye el punto "." que
divide la parte decimal 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 metacarcter, por lo que no es necesario antecederlo con la
barra inversa. El nico carcter que es necesario anteceder con la barra inversa
dentro de los corchetes es la propia barra inversa. La expresin regular "[\dA-Fa-f]"
nos permite encontrar dgitos hexadecimales. Los corchetes nos permiten tambin
encontrar palabras an si estn escritas de forma errnea, por ejemplo, la
expresin regular "expresi[o]n" permite encontrar en un texto la palabra
"expresin" 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 slo le dice al motor de bsqueda que encuentre un solo
carcter a la vez, es decir, que "expresi[o]n" no encontrar "expresion" o
"expresin".

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|
norte|sur" permitir encontrar cualquiera de los nombres de los puntos cardinales.
La barra se utiliza comnmente en conjunto con otros caracteres especiales.
El signo de dlar "$"
Representa el final de la cadena de caracteres o el final de la lnea, si se utiliza 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
punto finalice la lnea, lo que es til para avanzar entre prrafos.

El acento circunflexo "^"


Este carcter 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 carcter individual: el carcter "^"
representa el inicio de la cadena (de la misma forma que el signo de dlar "$"
representa el final de la cadena). Por tanto, si se utiliza la expresin regular "^[a-z]"
el motor encontrar 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 indicada permite encontrar, por ejemplo, cualquier carcter
que no sea alfanumrico o un espacio, es decir, busca todos los smbolos de
puntuacin y dems caracteres especiales.

La utilizacin 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 dgito "^\d\d/\d\d/\d\d\d\d$" permite validar una
fecha en formato corto, aunque no permite verificar si es una fecha vlida, ya que
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.

Los parntesis "()"


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

Los caracteres especiales conservan su significado dentro de los parntesis.

Los grupos establecidos con parntesis establecen una "etiqueta" o "punto de


referencia" para el motor de bsqueda que puede ser utilizada posteriormente
como 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 textos
que den indicaciones por medio de puntos cardinales, mientras que la expresin
regular "este|oeste|norte|sur" encontrara "este" en la palabra "esteban", no
pudiendo cumplir con este propsito.
Utilizados en conjunto con otros caracteres especiales que se detallan
posteriormente, ofrece funcionalidad adicional.

El signo de interrogacin "?"


El signo de interrogacin tiene varias funciones dentro del lenguaje de las
expresiones regulares. La primera de ellas es especificar que una parte de la
bsqueda es opcional. Por ejemplo, la expresin regular "ob?scuridad" permite
encontrar tanto "oscuridad" como "obscuridad". En conjunto con los parntesis
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 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 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 bsqueda no realizar una inversin
intil 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 parntesis definen grupos
"annimos", sin embargo el signo de pregunta en conjunto con los parntesis
triangulares "<>" permite "nombrar" estos grupos de la siguiente forma: "^(?
<Da>\d\d)\/(?<Mes>\d\d)\/(?<Ao>\d\d\d\d)$"; Con lo cual se le especifica al motor
de bsqueda que los primeros dos dgitos encontrados llevarn la etiqueta "Da",
los segundos la etiqueta "Mes" y los ltimos cuatro dgitos llevarn la etiqueta
"Ao".

NOTA: a pesar de la complejidad y flexibilidad dada por los caracteres especiales


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 adelante permiten establecer repeticiones.

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 derecha 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 podramos convertir el ejemplo "^\d\d/\d\d/\d\d\d\d$" que
serva para validar un formato de fecha en "^\d{2}/\d{2}/\d{4}$" para una mayor
claridad en la lectura de la expresin.
"\d{2,4}" Esta forma aade un segundo nmero separado por una coma, el cul
indica al motor de bsqueda que como mximo debe aparecer 4 veces la
expresin regular \d. Los posibles valores son:

"^\d\d$" (mnimo 2 repeticiones)

"^\d\d\d$"(tiene 3 repeticiones, por lo tanto entra en el rango 2-4)

"^\d\d\d\d$" (mximo 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 repeticin es variable. En estos casos los siguientes metacaracteres son
tiles.

El asterisco "*"
El asterisco sirve para encontrar algo que se encuentra repetido 0 o ms veces.
Por ejemplo, utilizando la expresin "[a-zA-Z]\d*" ser posible encontrar tanto "H"
como "H1", "H01", "H100" y "H1000", es decir, una letra seguida de un nmero
indefinido 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 encuentre 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 asterisco le dice al motor de bsqueda que llene todos los espacios
posibles entre los dos parntesis. Para obtener el resultado deseado se debe
utilizar el asterisco en conjunto con el signo de interrogacin de la siguiente forma:
"\(.*?\)" Esto es equivalente a decirle al motor de bsqueda que "Encuentre un
parntesis de apertura y luego encuentre cualquier secuencia de caracteres hasta
que encuentre un parntesis de cierre".

El signo de suma "+"


Se utiliza para encontrar una cadena que se encuentre repetida una o ms veces.
A diferencia 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 interrogacin para limitar hasta donde se efecta la repeticin.

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. El motor de bsqueda almacenar una referencia al grupo annimo que
corresponda 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
"<font>Esta</font>" como la cadena "<b>prueba</b>" en el texto
"<font>Esta</font> es una <b>prueba</b>" a pesar de que la expresin no
contiene los literales "font" y "B".

Otra forma de utilizar los grupos es en el lenguaje de programacin que se est


utilizando. Cada lenguaje tiene una forma distinta de acceder a los grupos. Los
ejemplos enumerados a continuacin utilizan las clases del .Net Framework,
usando la sintxis de C# (la cual puede fcilmente adaptarse a VB .Net o cualquier
otro lenguaje 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
encuentra 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
resultado 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
la expresin regular para poder utilizarlos posteriormente. Esto se hace de forma
diferente en los distintos motores de bsqueda, a continuacin 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. Ntese el signo de
pregunta y el texto "TagName" encerrado entre parntesis triangulares, seguido de
ste. Para 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
definir 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
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 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"]. Captures){
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.
Expresiones regulares

Las expresiones regulares se usan para analizar el contenido de cadenas de


caracteres por medio de patrones. Son muy tiles y por ello deberis aprender a
definir vuestros propios patrones.

Como en otras secciones, os remito a la gua de referencia de Perl para ver todo
el repertorio de smbolos y que se pueden usar para construir patrones.

Un patrn est delimitado por dos barras inclinadas, /patrn/ y los caracteres que
insertis en l pueden tener un significado literal u otro especial cuando vaya
precedido del modificador \. Por ejemplo, /n/ es un patrn que coincidir con
cualquier aparicin de un carcter n en una cadena. Sin embargo, /\n/ slo
coincidir con los caracteres de nueva lnea.

Creacin de una expresin regular


Una expresin regular puede crearse de cualquiera de las siguientes dos
maneras:

Utilizando una representacin literal de la expresin:

var re = /ab+c/;
La representacin literal compila la expresin regular una vez que el script ha
terminado de cargar. Es recomendable utilizar esta representacin cuando la
expresin regular vaya a permanecer sin cambios durante la ejecucin del script,
puesto que ofrece un mejor desempeo.

Constructor del objeto RegExp:


var re = new RegExp("ab+c");
El uso del constructor ofrece una compilacin de la expresin regular en
tiempo de ejecucin. Su uso es recomendable en aquellos escenarios en
que el patrn de la expresin regular pueda cambiar durante la ejecucin
del script, o bien, se desconoce el patrn, dado que se obtiene desde otra
fuente (cuando es suministrado por el usuario, por ejemplo).

Escribiendo un patrn de expresin regular


Un patrn de expresin regular se compone de caracteres simples, como /abc/, o
una combinacin de caracteres simples y especiales, como /ab*c/ o /Chapter
(\d+)\.\d*/. El segundo ejemplo incluye parntesis, los cuales se emplean como un
recurso de memoria. La coincidencia encontrada por esta parte del patrn es
almacenada para posterior uso, como se describe en Using Parenthesized
Substring Matches.
Utilizando patrones simples
Los patrones simples se construyen con caracteres para los que se desea una
coincidencia exacta. Por ejemplo, el patrn /abc/ coincidir slo con esta exacta
secuencia y orden de caracteres ('abc'). Tal expresin tendra resultados en las
cadenas "Hi, do you know your abc's?" y "The latest airplane designs evolved from
slabcraft." En ambos existe una coincidencia exacta con la subcadena 'abc'. No
hay coincidencia en la cadena 'Grab crab' debido a que, a pesar de que contiene
los caracteres 'a', 'b' y 'c', la sequencia 'abc' nunca aparece.

Utilizando caracteres especiales


Cuando la bsqueda de coincidencia require algo ms que una coincidencia
exacta, como por ejemplo el encontrar una o ms 'b', o encontrar espacios en
blanco, se incluyen en el patrn caracteres especiales. Por ejemplo, el patrn
/ab*c/ coincidir con cualquier sequencia de caracteres en la cual una 'a' preceda
a cualquier cantidad de 'b' (cero o ms) y sea inmediatamente seguida por una 'c'.
En la cadena 'cbbabbbbcdebc,' el patrn coincidir con la subcadena 'abbbbc'.

La siguiente tabla ofrece una lista completa de los caracteres especiales que
pueden utilizarse en las expresiones regulares.

Tabla 4.1 Caracteres especiales para expresiones regulares.

carcter Significado

Buscar coincidencias conforme a las siguientes reglas:

Una barra invertida precediendo un carcter simple indica que ste debe
ser interpretado como un carcter especial y no de forma literal. Por
ejemplo, una 'b' sin '\' precedindole coincidir con cualquier 'b' minscula
en la cadena, sin embargo, '\b' no coincidir con algn carcter en
especfico; representar el delimitador especial de palabras.

Una barra invertida que precede a un carcter especial indica que ste
\ deber ser interpretado literalmente, esto es, como un carcter simple y
no como un carcter especial. A esto se le demonina escapado. Por
ejemplo, en el patrn '/a*/' el '*' indica que se deber buscar una
secuencia de 'a' cero o ms veces; por el contrario, el cambiar el patrn a
'/a\*/', el carcter especial es interpretado como un carcter simple, y
cadenas como 'a*' harn coincidencia.

No se olvide de escapar la propia barra invertida al usarla en expresiones


regulares con strings - RegExp("patron") - ya que la \ es un carcter de
escapado en strings.

^ Coincide con el principio de la entrada. Si la bandera de multilnea est activada,


Tabla 4.1 Caracteres especiales para expresiones regulares.

carcter Significado

tambin coincidir inmediatamente despus de un salto de lnea.

Por ejemplo, /^A/ no coincide con la 'A' en "an A", pero s con la 'A' en "An E".

El carcter '^' tiene un significado diferente cuando aparece como el primer


carcter en un patrn. Vase patrones complementarios para mayores detalles y
ejemplos.

Busca el final de la entrada. Si la bandera de multilnea se establece en


true, tambin buscar inmediatamente antes de un carcter de salto de
lnea.
$
Por ejemplo, la expresin /r$/ no encontrar el carcter 'r' en la cadena
"cenaremos", pero s la encontrar en la cadena "cenar".

Busca el carcter precedente 0 (cero) o ms veces. Es equivalente a {0,}.

* Por ejemplo, la expresin /bo*/ encontrar la subcadena 'boooo' en la


cadena "A ghost booooed" y el carcter 'b' en la cadena "A bird warbled",
pero no encontrar nada en la cadena "A goat grunted".

Busca el carcter precedente 1 o ms veces. Es equivalente a {1,}.

+ Por ejemplo, la expresin /u+/ encontrar el carcter 'u' en la cadena


"dulce" y todos los caracteres 'u' en la cadena "duuuuulce".

Busca el carcter precedente 0 (cero) o 1 (una) vez. Es equivalente a {0,1}.

Por ejemplo, la expresin /e?le?/ encontrar la subcadena 'el' en la cadena


"angel" y la subcadena 'le' en la cadena "angle" y tambin el carcter 'l' en la
cadena "oslo".

Si se utiliza inmediatamente despus que cualquiera de los cuantificadores *,


+, ?, o {}, hace que el cuantificador no sea expansivo (encontrando la menor
? cantidad posible de caracteres), en comparacin con el valor predeterminado,
que s es expansivo (encontrando tantos caracteres como le sea posible). Por
ejemplo, aplicando la expresin /\d+/ a la cadena "123abc" encuentra "123". Pero
aplicando la expresin /\d+?/ a la misma cadena, encuentra solamente el carcter
"1".

Tambin se utiliza en coincidencias previsivas, como se describe en las


entradas x(?=y) y x(?!y) de esta tabla.
Tabla 4.1 Caracteres especiales para expresiones regulares.

carcter Significado

(El punto decimal) coincide con cualquier carcter excepto un carcter de


nueva lnea.
.
Por ejemplo , /.n/ coincide 'an' y 'on' en "nay, an apple is on the tree", pero
no 'nay'.

Busca 'x' y recuerda la bsqueda, como el siguiente ejemplo lo muestra.


Los parntesis son llamados parntesis de captura.

El '(foo)' y '(bar)' en el patrn /(foo) (bar) \1 \2/ busca y recuerda las primeras
(x) dos palabras en el string "foo bar foo bar". El \1 y \2 en el patron coincida
las dos ltimas palabras de la cadena. Nota que \1, \2, \n son usados en la
parte donde se define la expresin regular. Cuando se usan en la parte de
reemplazo, se debe usar la sintaxis $1, $2, $n en su lugar 'bar foo'.replace( /
(...) (...)/, '$2 $1' ).

Coincide con 'x' pero no recuerda la coincidencia. Los parntesis son llamados
parntesis no capturadores, y permiten definir subexpresiones para manipular
con los operadores de las expresiones regulares. Considera la expresin de
(?:x)
ejemplo /(?:foo){1,2}/. Si la expresin fuera /foo{1,2}/, los caracteres {1,2} se
aplicaran slo a la ltima 'o' en 'foo'. Con los parntesis no capturadores, {1,2} se
aplica a la palabra entera 'foo'.

Coincide con 'x' slo si 'x' es seguida por 'y'. Esto se denomina
previsin (lookahead, mirar adelante).

x(?=y) Por ejemplo, /Jack(?=Sprat)/ coincide con 'Jack' solo si es seguido por
'Sprat'. /Jack(?=Sprat|Frost)/ conicide con 'Jack' solo si es seguido por 'Sprat'
o 'Frost'. Sin embargo, ni 'Sprat' ni 'Frost' sern parte del resultado.

Coincide con 'x' solo si 'x' no es seguida por 'y'. Es una previsin negativa.

x(?!y) Por ejemplo, /\d+(?!\.)/ coincide con numeros solo si no vienen seguidos por
un punto decimal. La expresion regular /\d+(?!\.)/.exec("3.141") coincide con
'141' pero no con '3.141'.

Coincide con 'x' o 'y'.

x|y Por ejemplo, /green|red/ coincide con 'green' en "green apple" y 'red' en "red
apple."

{n} Coincide exactamente con n ocurrencias de la expresin. N debe ser un entero


Tabla 4.1 Caracteres especiales para expresiones regulares.

carcter Significado

positivo.

Por ejemplo, /a{2}/ no coincide con la 'a' en "candy," pero si con las a de
"caandy," y las 2 primeras a en "caaandy."

Donde n y m son enteros positivos y n <= m. Coincide con al menos n y no


ms de m ocurrencias de la expresin. Si se omite m, no tiene limite de
mximo.

{n,m} Por ejemplo, /a{1,3}/ no coincide con "cndy", pero s con la 'a' en "candy,"
las primeras 2 a en "caandy," y las primeras 3 a en "caaaaaaandy".
Note que en "caaaaaaandy", la coincidencia es "aaa", aunque la cadena
contenga ms a en ella.

Grupo de caracteres. Este tipo de patrn coincide con cada carcter dentro de
los corchetes, incluyendo secuencias de escapado. Caracteres especiales como
el punto (.) y el asterisco (*) no son especiales en un grupo, as que no necesitan
ser escapados. Puede especificar un rango utilizando un guin, como en el
[xyz]
siguiente ejemplo.

El patrn [a-d], que equivale a [abcd], coincide con la 'b' en "brisket" y la 'c' in
"city". El patrn /[a-z.]+/ y /[\w.]+/ coinciden con toda la cadena "test.i.ng".

Grupo de caracteres negativo. Significa que coincide con cualquier cosa


que no est en los corchetes. Puede especificar rangos. Todo lo que
funciona en el grupo de caracteres positivo funciona tambin aqu.
[^xyz]
Por ejemplo, [^abc] es lo mismo que [^a-c], y coincide con la 'r' en "brisket"
y 'h' en "chop."

Coincide con backspace (U+0008). Debe ir entre corchetes. (No confundir con
[\b]
\b.)

\b Coincide con un limite de palabra. Un limite de palabra coincide con la


posicion entre donde un carcter de palabra no viene precedido o seguido
por otro. Notese que el lmite no estar incluido en la coincidencia. En
otras palabras, la longitud del limite es cero. (No confundir con [\b].)

Ejemplos:
/\bm/ coincide con la 'm' de "moon" ;
/oo\b/ no tiene coincidencias en "moon", porque las 'oo' estan seguidas de
una 'n' que es un carcter de palabra;
/oon\b/ coincide con 'oon' en "moon", porque 'oon' es el final de la cadena,
Tabla 4.1 Caracteres especiales para expresiones regulares.

carcter Significado

por lo cual no va seguido de un carcter de palabra;


/\w\b\w/ no coincidir con nada, porque un carcter de palabra no puede
estar seguido por ambos, un limite y un carcter de palabra.

Coincide con un no-limite de palabra. Esto coincide con una posicion


donde el anterior y el siguiente carcter son del mismo tipo: ambos son o
no son caracteres de palabra. El inicio y el final de una cadena se
\B consideran no palabras.

Por ejemplo, /\B../ coincide con 'oo' en "noonday", y /y\B./ matches 'ye' in
"possibly yesterday."

Donde X es un carcter entre A y Z. Coincide con un carcter de control


en un string.
\cX
Por ejemplo, /\cM/ coincide con control-M (U+000D) en un string.

Coincide con un carcter de nmero. Equivalente a [0-9].


\d
Por ejemplo, /\d/ or /[0-9]/ coinciden con el '2' en "B2 is the suite number."

Coincide con cualquier carcter no numrico. Equivalente a [^0-9].


\D
Por ejemplo, /\D/ or /[^0-9]/ coincide con la 'B' en "B2 is the suite number."

\f Coincide con un form feed (salto de pgina) (U+000C).


\n Coincide con un line feed (salto de linea) (U+000A).
\r Coincide con un carriage return (retorno de carro) (U+000D).

Coincide con un carcter de espacio, entreellos incluidos espacio, tab,


salto de pgina, salto de linea y retorno de carro. Equivalente a [
\f\n\r\t\v\u00a0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u200
\s 8\u2009\u200a\u2028\u2029\u202f\u205f\u3000].

Por ejemplo, /\s\w*/ coincide con ' bar' en "foo bar."

\S Coincide con todo menos caracteres de espacio. Equivalente a [^


\f\n\r\t\v\u00a0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u200
8\u2009\u200a\u2028\u2029\u202f\u205f\u3000].
Tabla 4.1 Caracteres especiales para expresiones regulares.

carcter Significado

Por ejemplo, /\S\w*/ coincide con 'foo' en "foo bar."

\t Coincide con tab (U+0009).


\v Coincide con tab vertical (U+000B).

Coincide con cualquier carcter alfanumrico, incluyendo el guin bajo.


Equivalente a [A-Za-z0-9_].
\w
Por ejemplo, /\w/ coincide con 'a' en "apple," '5' en "$5.28," y '3' en "3D."

Coincide con todo menos caracteres de palabra. Equivalente a [^A-Za-z0-


9_].
\W
Por ejemplo, /\W/ o /[^A-Za-z0-9_]/ coinciden con '%' en "50%."

Cuando n es un entero positivo, es una referencia hacia alguna


subcadena de parntesis dentro de la misma expresion que coincida con
el nmero (contando los parntesis izquierdos).
\n
Por ejemplo, /apple(,)\sorange\1/ coincide con 'apple, orange,' en "apple,
orange, cherry, peach."

Coincide con el carcter NULL (U+0000). No preseda este por otro nmero, ya
\0
que \0<numero> se considera una secuencia octal escapada.
\xhh Coincide con un carcter en exadecimal hh (dos dgitos hexadecimales)

Coincide con un carcter unicode con el cdigo hhhh (cuatro dgitos


\uhhhh
hexadecimales).

Escapar la entrada del usuario para que sea tratada como una cadena literal en
una expresin regular se puede lograr mediante la sustitucin simple:

function escapeRegExp(string){
return string.replace(/([.*+?^${}()|\[\]\/\\])/g, "\\$1");
}
Usando parntesis
Los parntesis alrededor de alguna parte del patrn de la expresin regular hacen
que parte de la subcadena que coincida sea recordada. Una vez recordada, puede
ser rellamada en otro uso, como se describe en Using Parenthesized Substring
Matches.
Por ejemplo, el patrn /Chapter (\d+)\.\d*/ ilustra caracteres de escape y especiales
adicionales e indica que parte del patrn debe recordarse. Coincide con los
caracteres 'Chapter ' seguidos por uno o ms nmeros, luego un punto decimal,
seguido por cualquier nmero 0 o ms veces (para ms detalles vea la tabla 4.1).
Adems, se utilizaron parntesis para recordar el primer grupo de nmeros.

Este patrn se encuentra dentro del string "Open Chapter 4.3, paragraph 6" y se
memoriza el '4'. El patrn no se encuentra en "Chapter 3 and 4", porque no
consigue el punto despues del '3'.

Si no quiere memorizar la subcadena, utilice ?: al inicio de los parntesis. Por


ejemplo, (?:\d+) coincide con uno o ms nmeros pero no memoriza la
coincidencia.

Trabajando con Expresiones Regulares


Las expresiones regulares se utilizan con los mtodos de RegExp test y exec y con
los metodos de String match, replace, search, and split. Estos mtodos son explicados
en la Referencia JavaScript.

Tabla 4.2 Mtodos que utilizan expresiones regulares

Mtodo Descripcin

Un mtodo RegExp que ejecuta una bsqueda por una coincidencia en una
exec
cadena. Devuelve un array de informacin.

Un mtodo RegExp que verifica una coincidencia en una cadena. Devuelve true o
test
false.

Un mtodo String que ejecuta una bsqueda por una coincidencia en una cadena.
match
Devuelve un array de informacin o null si no existe coincidencia alguna.

Un mtodo String que verifica una coincidencia en una cadena. Devuelve el ndice
search
de la coincidencia, o -1 si la bsqueda falla.

Un mtodo String que ejecuta una bsqueda por una coincidencia en una cadena,
replace
y reemplaza la subcadena encontrada con una subcadena de reemplazo.

Un mtodo String que utiliza una expresin regular o una cadena fija para cortar
split
una cadena y colocarlo en un array de subcadenas.

Cuando quiera saber si un patrn se encuentra en una cadena, utilice los mtodos
test o search. Para obtener ms informacin (pero de ejecucin ms lenta) utilice los
mtodos exec o match. Si usted utiliza exec o match y se logra la coincidencia, estos
mtodos devuelven un array y actualizan las propiedades del objeto de la
expresin regular asociada y tambin aquellas del objeto de la expresin regular
predefinida, RegExp. Si la coincidencia falla, el mtodo exec devuelve null (que
coacciona a false).
En el siguiente ejemplo, el script usa el mtodo exec para buscar coincidencias en
un string.

var myRe = /d(b+)d/g;


var myArray = myRe.exec("cdbbdbsbz");
Si no necesita acceder a las propiedades de la expresin regular, una forma
alternativa de crear myArray es con este script:

var myArray = /d(b+)d/g.exec("cdbbdbsbz");


Si quiere construir la expresin regular desde un String, otra alternativa es:

var myRe = new RegExp("d(b+)d", "g");


var myArray = myRe.exec("cdbbdbsbz");
Todos estos ejemplos tienen coincidencias, por lo que se retorna un array, y se
actualizan las propiedades mostradas en la siguiente tabla.

Tabla 4.3 Resultados de la ejecucin de la expresin regular.

Propiedad o En el
Objeto Descripcin
indice ejemplo

Las coincidencias y las subcadenas memorizadas. ["dbbd", "bb"]

index La posicin de la coincidencia en la cadena de entrada. 1


myArray
input La cadena original. "cdbbdbsbz"

[0] La ltima coincidencia de caracteres. "dbbd"

La posicin de donde iniciar la prxima bsqueda.


(Esta propiedad solo es seteada si la expresin utiliza
lastIndex 5
la opcin g, descrita en Advanced Searching With
myRe Flags.)

El texto del patrn. Actualizado al momento de


source "d(b+)d"
creacin, no al ejecutarse.

Como puede verse en la segunda lnea de este ejemplo, puede usar una
expresin regular creada con un inicializador de objeto sin asignarse a una
variable. Si lo hace, sin embargo, cada ocurrencia ser una nueva expresin
regular. Por esta razn, si usa este mtodo sin asignarlo a una variable, no podr
acceder posteriormente a las propiedades de estas expresiones regulares. Por
ejemplo, suponga que tiene el siguiente script:

var myRe = /d(b+)d/g;


var myArray = myRe.exec("cdbbdbsbz");
console.log("The value of lastIndex is " + myRe.lastIndex);
El script mostrar:

The value of lastIndex is 5


Sin embargo, si el script utilizado es ste:

var myArray = /d(b+)d/g.exec("cdbbdbsbz");


console.log("The value of lastIndex is " + /d(b+)d/g.lastIndex);
Se mostrar lo siguiente:

The value of lastIndex is 0


Las apariciones de /d(b+)d/g en las dos sentencias son objetos de expresiones
regulares distintas y, por lo tanto, tienen diferentes valores en su propiedad
lastIndex. Si necesita acceder a las propiedades de una expresin regular creada
con un inicializador de objeto, deber, previamente, asignarla a una variable.

Using Parenthesized Substring Matches


Including parentheses in a regular expression pattern causes the corresponding
submatch to be remembered. For example, /a(b)c/ matches the characters 'abc' and
remembers 'b'. To recall these parenthesized substring matches, use the Array
elements [1], ..., [n].

The number of possible parenthesized substrings is unlimited. The returned array


holds all that were found. The following examples illustrate how to use
parenthesized substring matches.

Ejemplo 1
El siguiente script usa el mtodo replace() para intercambiar palabras en el string.
Para el texto de reemplazo, el script utiliza $1 y $2 en el reemplazo para denotar la
primera y segunda coincidencias de subcadena entre ubicadas entre parntesis.

var re = /(\w+)\s(\w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$2, $1");
console.log(newstr);
Esto devuelve "Smith, John".

Bsqueda Avanzada Con 'Banderas' (Flags)


Las expresiones regulares tienen cuatro banderas opcionales que permiten
realizar bsquedas globales y sin distincin de maysculas y minsculas. Estas
banderas pueden utilizarse por separado o juntas y en cualquier orden; y se
incluyen como parte de la expresin regular.

Table 4.4 Regular expression flags.

Bandera Descripcin
g Bsqueda global.

i Bsqueda 'case-insensitive' (no sensible a maysculas).

m Bsqueda multilineal.
Table 4.4 Regular expression flags.

Bandera Descripcin

Perform a "sticky" search that matches starting at the current position in the
y
target string.

Nota sobre Firefox 3

Support for the y flag was added in Firefox 3. The y flag fails if the match doesn't
succeed at the current position in the target string.

Para incluir una bandera con la expresin regular, se usa la siguiente sintaxis:

var re = /pattern/flags;
o

var re = new RegExp("pattern", "flags");


Ntese que las banderas son una parte integral de la expresin regular. Ellas no
pueden ser agregadas o eliminadas a posteriori.

Por ejemplo, re = /\w+\s/g crea una expresin regular que busca uno o ms
caracteres seguidos por un espacio; y busca esta combinacin en la totalidad del
string.

var re = /\w+\s/g;
var str = "fee fi fo fum";
var myArray = str.match(re);
console.log(myArray);
Esto devuelve ["fee ", "fi ", "fo "].
En este ejemplo, puede reemplzar la lnea:

var re = /\w+\s/g;
con:

var re = new RegExp("\\w+\\s", "g");


y obtener el mismo resultado.

La bandera m es usada para especificar que un string multilineal debe ser tratado
como varias lneas independientes. Si m es usada, ^ y $ actuarn al inicio y final de
cada lnea del string en vez del inicio y final del string completo.

Ejemplos
Los siguientes ejemplos muestran algunos usos de las expresiones regulares:
Changing the Order in an Input String
The following example illustrates the formation of regular expressions and the use
of string.split() and string.replace(). It cleans a roughly formatted input string containing
names (first name first) separated by blanks, tabs and exactly one semicolon.
Finally, it reverses the name order (last name first) and sorts the list.

// The name string contains multiple spaces and tabs,


// and may have multiple spaces between first and last names.
var names = "Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ; Chris Hand ";

var output = ["---------- Original String\n", names + "\n"];

// Prepare two regular expression patterns and array storage.


// Split the string into array elements.

// pattern: possible white space then semicolon then possible white space
var pattern = /\s*;\s*/;

// Break the string into pieces separated by the pattern above and
// store the pieces in an array called nameList
var nameList = names.split(pattern);

// new pattern: one or more characters then spaces then characters.


// Use parentheses to "memorize" portions of the pattern.
// The memorized portions are referred to later.
pattern = /(\w+)\s+(\w+)/;

// New array for holding names being processed.


var bySurnameList = [];

// Display the name array and populate the new array


// with comma-separated names, last first.
//
// The replace method removes anything matching the pattern
// and replaces it with the memorized stringsecond memorized portion
// followed by comma space followed by first memorized portion.
//
// The variables $1 and $2 refer to the portions
// memorized while matching the pattern.

output.push("---------- After Split by Regular Expression");

var i, len;
for (i = 0, len = nameList.length; i < len; i++){
output.push(nameList[i]);
bySurnameList[i] = nameList[i].replace(pattern, "$2, $1");
}

// Display the new array.


output.push("---------- Names Reversed");
for (i = 0, len = bySurnameList.length; i < len; i++){
output.push(bySurnameList[i]);
}
// Sort by last name, then display the sorted array.
bySurnameList.sort();
output.push("---------- Sorted");
for (i = 0, len = bySurnameList.length; i < len; i++){
output.push(bySurnameList[i]);
}

output.push("---------- End");

console.log(output.join("\n"));
Using Special Characters to Verify Input
In the following example, the user is expected to enter a phone number. When the
user presses the "Check" button, the script checks the validity of the number. If the
number is valid (matches the character sequence specified by the regular
expression), the script shows a message thanking the user and confirming the
number. If the number is invalid, the script informs the user that the phone number
is not valid.

Within non-capturing parentheses (?: , the regular expression looks for three
numeric characters \d{3} OR | a left parenthesis \( followed by three digits \d{3},
followed by a close parenthesis \), (end non-capturing parenthesis )), followed by
one dash, forward slash, or decimal point and when found, remember the
character ([-\/\.]), followed by three digits \d{3}, followed by the remembered match of
a dash, forward slash, or decimal point \1, followed by four digits \d{4}.

The Change event activated when the user presses Enter sets the value of
RegExp.input.

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<script type="text/javascript">
var re = /(?:\d{3}|\(\d{3}\))([-\/\.])\d{3}\1\d{4}/;
function testInfo(phoneInput){
var OK = re.exec(phoneInput.value);
if (!OK)
window.alert(RegExp.input + " isn't a phone number with area code!");
else
window.alert("Thanks, your phone number is " + OK[0]);
}
</script>
</head>
<body>
<p>Enter your phone number (with area code) and then click "Check".
<br>The expected format is like ###-###-####.</p>
<form action="#">
<input id="phone"><button
onclick="testInfo(document.getElementById('phone'));">Check</button>
</form>
</body>
</html>

Potrebbero piacerti anche