Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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.
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.
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.
AWK: Forma una parte esencial del lenguaje y por extensin de la herramienta
awk de Unix/Linux
Java: existen varias bibliotecas hechas para java que permiten el uso de RegEx, y
Sun planea dar soporte a estas desde el SDK
PCRE: biblioteca de ExReg para C, C++ y otros lenguajes que puedan utilizar
bibliotecas dll (Visual Basic 6 por ejemplo).
\t Representa un tabulador.
\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.
Notas:
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.
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.
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".
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".
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.
"<?(?<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
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.
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.
La siguiente tabla ofrece una lista completa de los caracteres especiales que
pueden utilizarse en las expresiones regulares.
carcter Significado
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.
carcter Significado
Por ejemplo, /^A/ no coincide con la 'A' en "an A", pero s con la 'A' en "An E".
carcter Significado
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'.
x|y Por ejemplo, /green|red/ coincide con 'green' en "green apple" y 'red' en "red
apple."
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."
{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".
Coincide con backspace (U+0008). Debe ir entre corchetes. (No confundir con
[\b]
\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 ejemplo, /\B../ coincide con 'oo' en "noonday", y /y\B./ matches 'ye' in
"possibly yesterday."
carcter Significado
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)
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'.
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.
Propiedad o En el
Objeto Descripcin
indice ejemplo
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:
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".
Bandera Descripcin
g Bsqueda global.
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.
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
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:
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.
// 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);
var i, len;
for (i = 0, len = nameList.length; i < len; i++){
output.push(nameList[i]);
bySurnameList[i] = nameList[i].replace(pattern, "$2, $1");
}
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>