S铆mbolos comunes en expresiones regulares
Descripci贸n
|
|
. |
Un
punto indica cualquier car谩cter
|
^expresi贸n |
El
s铆mbolo ^ indica el principio del String. En este caso el String debe
contener la expresi贸n al principio.
|
expresi贸n$ |
El s铆mbolo $ indica el final del String. En este caso el
String debe contener la expresi贸n al final.
|
[abc] |
Los corchetes representan una definici贸n de conjunto.
En este ejemplo el
String debe contener las letras a 贸 b 贸 c.
|
[abc][12] |
El String
debe contener las letras a 贸 b 贸 c seguidas de 1 贸 2
|
[^abc] |
El
s铆mbolo ^ dentro de los corchetes indica negaci贸n. En este caso el String
debe contener cualquier car谩cter excepto a 贸 b 贸 c.
|
[a-z1-9] |
Rango. Indica las letras min煤sculas
desde la a hasta la z (ambas incluidas) y los d铆gitos desde el 1 hasta el 9 (ambos
incluidos)
|
A|B |
El car谩cter
| es un OR. A 贸 B
|
AB
|
Concatenaci贸n.
A seguida de B
|
Meta caracteres
Expresi贸n
|
Descripci贸n
|
\d |
D铆gito. Equivale a [0-9]
|
\D |
No d铆gito. Equivale a [^0-9]
|
\s |
Espacio
en blanco. Equivale a [ \t\n\x0b\r\f]
|
\S |
No
espacio en blanco. Equivale a [^\s]
|
\w |
Una
letra may煤scula o min煤scula, un d铆gito o el car谩cter _
Equivale
a [a-zA-Z0-9_]
|
\W |
Equivale a [^\w]
|
\b |
L铆mite de una palabra.
|
Expresi贸n
|
Descripci贸n
|
{X} |
Indica
que lo que va justo antes de las llaves se repite X veces
|
{X,Y} |
Indica que lo que va justo antes de las llaves se repite
m铆nimo X veces y m谩ximo Y veces. Tambi茅n podemos poner {X,} indicando que se
repite un m铆nimo de X veces sin l铆mite m谩ximo.
|
* |
Indica
0 贸 m谩s veces. Equivale a {0,}
|
+ |
Indica
1 贸 m谩s veces. Equivale a {1,}
|
? |
Indica
0 贸 1 veces. Equivale a {0,1} |
[abc] | Representa un car谩cter que puede ser 'a' 贸 'b' 贸 'c'. |
[^abc] | Representa cualquier car谩cter excepto 'a' y 'b' y 'c'; en este caso cuando digo cualquier caracter, no me refiero solo a letras. |
[a-z] | Representa el rango comprendido de la 'a' hasta la 'z', ojo no incluye '帽', vocales con tildes, ni consonantes con di茅resis, en pocas palabras solo se aceptan el alfabeto ingles. |
[a-z帽] | Representa el rango comprendido de la 'a' hasta la 'z', esta vez si incluye '帽', ojo solo incluye a la '帽', si queremos incluir m谩s caracteres los colocamos al lado de la '帽'. |
[A-Z] | Representa el rango comprendido de la 'A' hasta la 'Z', ojo no incluye '帽', solo el alfabeto ingles. |
[a-zA-Z] | Representa el rango comprendido de la 'a' hasta la 'z' 贸 'A' hasta la 'Z',pero solo el alfabeto ingles. |
[a-d[m-p]] | Es equivalente a [a-dm-p], n贸tese que es parecido a la expresi贸n anterior, representa el rango comprendido de la 'a' hasta la 'b' y 'm' hasta la 'p', es decir solo quedan incluidas 'a','b','c','d' y 'm','n','o','p'. |
[a-z&&[def]] | Es equivalente a [def], es la intersecci贸n del conjunto de la 'a' hasta la 'z' y el conjunto 'd','e','f', el resultado es el mismo conjunto 'd','e','f'; aunque se ve innecesario esta expresi贸n nos ayudara a comprender la que sigue. |
[a-z&&[^def]] | Representa la intersecci贸n del conjunto de la 'a' hasta la 'z' y el conjunto todo el abecedario excepto los caracteres 'd','e','f', el resultado es el conjunto del abecedario excluyendo 'd','e','f'. |
[a-z&&[^m-p]] | Representa la intersecci贸n del conjunto de la 'a' hasta la 'z' y el conjunto todo el abecedario excepto los caracteres 'm','n','o','p'. |
Descripci贸n de las expresiones regularesEl punto "."El punto se interpreta por el motor de b煤squeda como "cualquier car谩cter", es decir, busca cualquier car谩cter SIN incluir los saltos de l铆nea. Los motores de Expresiones regulares tienen una opci贸n de configuraci贸n que permite modificar este comportamiento. En .Net Framework se utiliza la opci贸n RegexOptions.Singleline para especificar la opci贸n de que busque todos los caracteres incluidos el salto de l铆nea (\n). El punto se utiliza de la siguiente forma: Si se le dice al motor de RegEx que busque "g.t" en la cadena "el gato de piedra en la g贸tica puerta de getisboro goot" el motor de b煤squeda encontrar谩 "gat", "g贸t" y por 煤ltimo "get". N贸tese que el motor de b煤squeda no encuentra "goot"; esto es porque el punto representa un solo car谩cter y 煤nicamente uno. Si es necesario que el motor encuentre tambi茅n la expresi贸n "goot", ser谩 necesario utilizar repeticiones, las cuales se explican m谩s adelante. Aunque el punto es muy 煤til para encontrar caracteres que no conocemos, es necesario recordar que corresponde a cualquier car谩cter y que muchas veces esto no es lo que se requiere. Es muy diferente buscar cualquier car谩cter que buscar cualquier car谩cter alfanum茅rico o cualquier d铆gito o cualquier no-d铆gito o cualquier no-alfanum茅rico. Se debe tomar esto en cuenta antes de utilizar el punto y obtener resultados no deseados. El signo de admiraci贸n "!"Se utiliza para realizar una "b煤squeda anticipada negativa". La construcci贸n de la expresi贸n regular es con el par de par茅ntesis, el par茅ntesis de apertura seguida de un signo de interrogaci贸n y un signo de exclamaci贸n. Dentro de la b煤squeda tenemos la expresi贸n regular. Por ejemplo, para excluir exactamente una palabra, habr谩 que utilizar "^(palabra.+|(?!palabra).*)$" La barra inversa o contrabarra "\"La barra inversa se utiliza para escapar el siguiente car谩cter de la expresi贸n de b煤squeda de forma que este adquiera un significado especial o deje de tenerlo. O sea, la barra inversa no se utiliza nunca por s铆 sola, sino en combinaci贸n con otros caracteres. Al utilizarlo por ejemplo en combinaci贸n con el punto "\." este deja de tener su significado normal y se comporta como un car谩cter literal. De la misma forma, cuando se coloca la barra inversa seguida de cualquiera de los caracteres especiales que discutiremos a continuaci贸n, estos dejan de tener su significado especial y se convierten en caracteres de b煤squeda literal. Como ya se mencion贸 con anterioridad, la barra inversa tambi茅n puede darle significado especial a caracteres que no lo tienen. A continuaci贸n hay una lista de algunas de estas combinaciones:
Notas:
Los corchetes "[ ]"La funci贸n de los corchetes en el lenguaje de las expresiones regulares es representar "clases de caracteres", o sea, agrupar caracteres en grupos o clases. Son 煤tiles cuando es necesario buscar uno de un grupo de caracteres. Dentro de los corchetes es posible utilizar el guion "-" para especificar rangos de caracteres. Adicionalmente, los metacaracteres pierden su significado y se convierten en literales cuando se encuentran dentro de los corchetes. Por ejemplo, como vimos en la entrega anterior "\d" nos es 煤til para buscar cualquier car谩cter que represente un d铆gito. Sin embargo esta denominaci贸n no incluye el punto "." que divide la parte decimal de un n煤mero. Para buscar cualquier car谩cter que representa un d铆gito o un punto podemos utilizar la expresi贸n regular "[\d.]". Como se hizo notar anteriormente, dentro de los corchetes, el punto representa un car谩cter literal y no un metacar谩cter, por lo que no es necesario antecederlo con la barra inversa. El 煤nico car谩cter que es necesario anteceder con la barra inversa dentro de los corchetes es la propia barra inversa. La expresi贸n regular "[\dA-Fa-f]" nos permite encontrar d铆gitos hexadecimales. Los corchetes nos permiten tambi茅n encontrar palabras aun si est谩n escritas de forma err贸nea, por ejemplo, la expresi贸n regular "expresi[o贸]n" permite encontrar en un texto la palabra "expresi贸n" aunque se haya escrito con o sin tilde. Es necesario aclarar que sin importar cuantos caracteres se introduzcan dentro del grupo por medio de los corchetes, el grupo s贸lo le dice al motor de b煤squeda que encuentre un solo car谩cter a la vez, es decir, que "expresi[o贸]n" encontrar谩 "expresion" o "expresi贸n". La barra "|"Sirve para indicar una de varias opciones. Por ejemplo, la expresi贸n regular "a|e" encontrar谩 cualquier "a" o "e" dentro del texto. La expresi贸n regular "este|oeste|norte|sur" permitir谩 encontrar cualquiera de los nombres de los puntos cardinales. La barra se utiliza com煤nmente en conjunto con otros caracteres especiales. El signo de d贸lar "$"Representa el final de la cadena de caracteres o el final de la l铆nea, si se utiliza el modo multi-l铆nea. No representa un car谩cter en especial sino una posici贸n. Si se utiliza la expresi贸n regular "\.$" el motor encontrar谩 todos los lugares donde un punto finalice la l铆nea, lo que es 煤til para avanzar entre p谩rrafos. El acento circunflejo "^"Este car谩cter tiene una doble funcionalidad, que difiere cuando se utiliza individualmente y cuando se utiliza en conjunto con otros caracteres especiales. En primer lugar su funcionalidad como car谩cter individual: el car谩cter "^" representa el inicio de la cadena (de la misma forma que el signo de d贸lar "$" representa el final de la cadena). Por tanto, si se utiliza la expresi贸n regular "^[a-z]" el motor encontrar谩 todos los p谩rrafos que den inicio con una letra min煤scula. Cuando se utiliza en conjunto con los corchetes de la siguiente forma "[^\w ]" permite encontrar cualquier car谩cter que NO se encuentre dentro del grupo indicado. La expresi贸n indicada permite encontrar, por ejemplo, cualquier car谩cter que no sea alfanum茅rico o un espacio, es decir, busca todos los s铆mbolos de puntuaci贸n y dem谩s caracteres especiales. La utilizaci贸n en conjunto de los caracteres especiales "^" y "$" permite realizar validaciones en forma sencilla. Por ejemplo "^\d$" permite asegurar que la cadena a verificar representa un 煤nico d铆gito "^\d\d/\d\d/\d\d\d\d$" permite validar una fecha en formato corto, aunque no permite verificar si es una fecha v谩lida, ya que 99/99/9999 tambi茅n ser铆a v谩lido en este formato; la validaci贸n completa de una fecha tambi茅n es posible mediante expresiones regulares, como se ejemplifica m谩s adelante. Los par茅ntesis "()"De forma similar que los corchetes, los par茅ntesis sirven para agrupar caracteres, sin embargo existen varias diferencias fundamentales entre los grupos establecidos por medio de corchetes y los grupos establecidos por par茅ntesis:
El signo de interrogaci贸n "?"El signo de interrogaci贸n tiene varias funciones dentro del lenguaje de las expresiones regulares. La primera de ellas es especificar que una parte de la b煤squeda es opcional. Por ejemplo, la expresi贸n regular "ob?scuridad" permite encontrar tanto "oscuridad" como "obscuridad". En conjunto con los par茅ntesis redondos permite especificar que un conjunto mayor de caracteres es opcional; por ejemplo "Nov(\.|iembre|ember)?" permite encontrar tanto "Nov" como "Nov.", "Noviembre" y "November". Como se mencion贸 anteriormente, los par茅ntesis nos permiten establecer un "punto de referencia" para el motor de b煤squeda. Sin embargo, algunas veces, no se desea utilizarlos con este prop贸sito, como en el ejemplo anterior "Nov(\.|iembre|ember)?". En este caso el establecimiento de este punto de referencia (que se detalla m谩s adelante) representa una inversi贸n in煤til de recursos por parte del motor de b煤squeda. Para evitarlo se puede utilizar el signo de pregunta de la siguiente forma: "Nov(?:\.|iembre|ember)?". Aunque el resultado obtenido ser谩 el mismo, el motor de b煤squeda no realizar谩 una inversi贸n in煤til de recursos en este grupo, sino que lo ignorar谩. Cuando no sea necesario reutilizar el grupo, es aconsejable utilizar este formato. De forma similar, es posible utilizar el signo de pregunta con otro significado: Los par茅ntesis definen grupos "an贸nimos", sin embargo el signo de pregunta en conjunto con los par茅ntesis triangulares "<>" permite "nombrar" estos grupos de la siguiente forma: "^(?<D铆a>\d\d)\/(?<Mes>\d\d)\/(?<A帽o>\d\d\d\d)$"; Con lo cual se le especifica al motor de b煤squeda que los primeros dos d铆gitos encontrados llevar谩n la etiqueta "D铆a", los segundos la etiqueta "Mes" y los 煤ltimos cuatro d铆gitos llevar谩n la etiqueta "A帽o". NOTA: a pesar de la complejidad y flexibilidad dada por los caracteres especiales estudiados hasta ahora, en su mayor铆a nos permiten encontrar solamente un car谩cter a la vez, o un grupo de caracteres a la vez. Los metacaracteres enumerados en adelante permiten establecer repeticiones. Las llaves "{}"Com煤nmente las llaves son caracteres literales cuando se utilizan por separado en una expresi贸n regular. Para que adquieran su funci贸n de metacaracteres es necesario que encierren uno o varios n煤meros separados por coma y que est茅n colocados a la derecha de otra expresi贸n regular de la siguiente forma: "\d{2}" Esta expresi贸n le dice al motor de b煤squeda que encuentre dos d铆gitos contiguos. Utilizando esta f贸rmula podr铆amos convertir el ejemplo "^\d\d/\d\d/\d\d\d\d$" que serv铆a para validar un formato de fecha en "^\d{2}/\d{2}/\d{4}$" para una mayor claridad en la lectura de la expresi贸n. "\d{2,4}" Esta forma a帽ade un segundo n煤mero separado por una coma, el cual indica al motor de b煤squeda que como m谩ximo debe aparecer 4 veces la expresi贸n regular \d. Los posibles valores son:
Nota: aunque esta forma de encontrar elementos repetidos es muy 煤til, algunas veces no se conoce con claridad cuantas veces se repite lo que se busca o su grado de repetici贸n es variable. En estos casos los siguientes metacaracteres son 煤tiles. El asterisco "*"El asterisco sirve para encontrar algo que se encuentra repetido 0 o m谩s veces. Por ejemplo, utilizando la expresi贸n "[a-zA-Z]\d*" ser谩 posible encontrar tanto "H" como "H1", "H01", "H100" y "H1000", es decir, una letra seguida de un n煤mero indefinido de d铆gitos. Es necesario tener cuidado con el comportamiento del asterisco, ya que este, por defecto, trata de encontrar la mayor cantidad posible de caracteres que correspondan con el patr贸n que se busca. De esta forma si se utiliza "\(.*\)" para encontrar cualquier cadena que se encuentre entre par茅ntesis y se lo aplica sobre el texto "Ver (Fig. 1) y (Fig. 2)" se esperar铆a que el motor de b煤squeda encuentre los textos "(Fig. 1)" y "(Fig. 2)", sin embargo, debido a esta caracter铆stica, en su lugar encontrar谩 el texto "(Fig. 1) y (Fig. 2)". Esto sucede porque el asterisco le dice al motor de b煤squeda que llene todos los espacios posibles entre los dos par茅ntesis. Para obtener el resultado deseado se debe utilizar el asterisco en conjunto con el signo de interrogaci贸n de la siguiente forma: "\(.*?\)" Esto es equivalente a decirle al motor de b煤squeda que "Encuentre un par茅ntesis de apertura y luego encuentre cualquier secuencia de caracteres hasta que encuentre un par茅ntesis de cierre". El signo de suma "+"Se utiliza para encontrar una cadena que se encuentre repetida una o m谩s veces. A diferencia del asterisco, la expresi贸n "[a-zA-Z]\d+" encontrar谩 "H1" pero no encontrar谩 "H". Tambi茅n es posible utilizar este metacar谩cter en conjunto con el signo de interrogaci贸n para limitar hasta donde se efect煤a la repetici贸n. |
Comentarios
Publicar un comentario