Contacto

Nos puedes enviar un artículo a publicar (si te fue útil, seguro que a otros también).
Nos puedes sugerir temas/profundidad de interés.
correo-e - perfil

Busquedas

Expresiones Regulares - Metacaracteres

 Expresiones Regulares

   Una expresión regular es un conjunto de caracteres que se lo conoce como "patrón". Por medio de aplicaciones que soporten expresiones regulares, es posible buscar o sustituir estos patrones dentro de un texto, evitando tener que escribir código específico para esa tarea.
   Si bien las expresiones regulares son una herramienta muy potente para la manipulación de texto, puede dificultar el mantenimiento y/o localización de errores, cuando se generan patrones complejos. En estos casos, la clásica recomendación ... documentar.
   Un ejemplo de patrón que suele estar en los textos que tocan el tema, es la búsqueda de un archivo desde linea de comando, por ejemplo:
     ls m*.txt  ( o en DOS:  dir m*.txt)  :  este patrón busca todos los archivos que comienzan con la letra "m", continúan con cualquier carácter, y terminan con ".txt".

 Metacaracteres en expresiones regulares:
   Algunos caracteres en una expresión regular tienen un comportamiento específico. A estos caracteres se los conoce como "metacaracteres". En la siguiente lista, se explica algunos de estos importantes caracteres, que usaremos en diferentes ejemplos:

Operador Descripción Ejemplo
\ Es el carácter de escape. Modifica el comportamiento "normal" del carácter que le sigue. Por ejemplo, si se quiere buscar el propio carácter "\", se tiene que hacer por medio de "\\"
^ Indica una coincidencia al comienzo de la cadena (ver diferencia cuando se usa con parentesis rectos) ^Linux Indica que comienza con la frase "Linux"
$ Indica una coincidencia al final de la cadena. Ubuntu$ Indica que termina con la frase "Ubuntu"
. Usado cuando se quiere representar cualquier carácter (sin incluir el salto de linea '\n').
| Funciona como el "OR" para las expresiones regulares. Coincide con la expresión en un lado u otro del carácter "|" Por ejemplo, lin(ux|terna) coincide con linux y linterna (luego veremos el metacarácter "(...)"
[ ] Se busca coincidencia con cualquier carácter incluido dentro de los paréntesis rectos. EN "Linu[xsr]" hay coincidencia con: Linux Linur Linus
[ - ] El "-" se usa para indicar un intervalo de caracteres [a-z] representa cualquier carácter alfabético en minúscula. [2-4] representa cualquier dígito entre 2 y 4.
doc[2-4] coincide con doc2 doc3 doc4
[^ ] Con "[^" se indica "clase exclusiva" o negativo. Se usa cuando el patrón de búsqueda coincide con cualquier carácter, EXCEPTO éstos. En doc[^24], NO coincide con doc4 o doc2, sí con doc3, docu . También usado con intervalos de caracteres
( ) Representa un grupo de caracteres que son tratados como una única expresión En doc(24|umentos), Coincide con doc24 y documentos (Ver que se uso el carácter "|" en el ejemplo)
Representación de caracteres que se repiten
* Indica que la expresión anterior al carácter puede repetirce cero o más veces. "ub*" indica que el carácter "b" puede no existir, por lo que va a coincidir la expresión con todas las 'u',
y si existe, coincide con todas las repeticiones de 'b' luego de una 'u'. Por lo que va a coincidir con:
ubuntu, ubbbuntu incluso solo con ucualquierCosa
+ Indica que la expresión anterior al carácter se repite una o más veces. "li+" coincide con linux , con liinux , pero no "lalgo" o "l" (tiene que estar el carácter 'i')
? Indica que la expresión anterior a éste símbolo es opcional, por lo que puede estar una sola vez, o ninguna "Linux?" coincide con Linux o con Linu
{N} Indica que se encuentra coincidencia cuando la expresión anterior se repite N veces. x{2} coincide con xx. Si indicamos sustituir x{2} por Z, en xxxx por defecto, el resultado será ZZ
{N,} Indica que se encuentra coincidencia cuando se repite como mínimo N veces (sin máximo). x{2,} coincide con xx (y todas las x que estén luego). Si indicamos sustituir x{2,} por Z, en xxxx por defecto el resultado será Z
{N,M} Indica que la expresión anterior se repite como mínimo N veces, y no más de M veces. x{2,3} coincide con xx y con xxx.
Notas: En estos casos, si N es el único valor, N >=1. En el resto de los casos, N >= 0, y si se usa M, N <= M
<patronRepetición>? Si se agrega ? luego de alguno de los cuantificadores anteriores " *, +, ?, {N}, {N,}, {N,M})", se genera una versión "lazy".
Lo que hace es coincidir con la mínima expresión posible. Este concepto es importante y suele generar confusiones con el comportamiento por defecto,
en donde la coincidencias se expanden a la mayor expresión posible.
Si en: "<b>asljlj</b> <b>tarja</b>" queremos reemplazar todo el texto que hay dentro de los
tags "<b>...</b>" por ZZ, tenemos que usar este modo "lazy", la solución sería:
"<b>.*?</b>", de esta forma coincide con el texto dentro de cada bloque, y tendríamos:
"<b>ZZ</b> <b>ZZ</b>".
Si no se usa el modo lazy ("<b>.*</b>") el comportamiento seria modificar TODO el texto desde el primer tag
"<b>" (incluso otros tags <b> y </b>) hasta llegar al último tag "</b>", con el resultado:
"<b>ZZ</b>"
A continuación un grupo de metacaracteres que representan un "atajo" en representación de patrones.
 \w   Representa a cualquier carácter alfanumérico, incluyendo el guión bajo. Equivale a [a-zA-Z0-9_]'.
 \W  Representa a cualquier carácter que no sea alfanumérico. Equivale a [^a-zA-Z0-9_] .
 \d Representa cualquier dígito. Equivale a [0-9]. doc\d es igual a doc\d
 \D Reprecenta a cualquier carácter que NO sea un dígito. Equivale a [^0-9].
 \s Coincide con cualquier carácter que represente espacio en blanco, incluido nueva línea. Equivale a [^ \n\r\f\t\v].
 \S  Representa a cualquier carácter excepto aquellos que sean espacio en blanco. Equivale a [^ \n\r\f\t\v].
Algunos caracteres de texto no imprimibles
  \n   Representa el carácter de nueva línea.
\r Representa el carácter de retorno de carro.
\t Representa el carácter de tabulación.
\v Representa el carácter de tabulación vertical.
\f Representa un salto de página.


Muchos lenguajes y programas soportan expresiones regulares, como ser java, oracle, .net, perl, entre muchos otros, con sus particularidades. Hemos visto algo en los artículos dedicados a grep y el editor vi. En próximos post veremos algunas herramientas que nos faciliten la creación y pruebas de nuestras expresiones regulares, y el uso en java.

No hay comentarios: