lunes, 9 de diciembre de 2013

Expresiones regulares

Resto de entradas con intenciones didácticas en la etiqueta Aprendizaje.

El de las expresiones regulares es uno de los capítulos más farragosos de los sistemas GNU/Linux pero que más atención merece, y dominarlas supone extender muy mucho las prestaciones de la consola de comandos. Vendrían a ser como una versión avanzada de los caracteres comodín y unas posibilidades exponencialmente mayores.


No tiene mayor secreto que aprenderlas y, luego, practicar para averiguar hasta qué punto podemos usarlas en búsquedas, sustituciones de texto o scripts. Las dividiremos en metacaracteres, anclas y multiplicadores.


Metacaracteres

Son conjuntos de caracteres dentro de una expresión regular y con un significado o función específicos
. : equivale a cualquier carácter.
( ) : sirve para agrupar patrones (subexpresiones o grupos).
[ ] : equivale a un carácter cualquiera de los contenidos entre corchetes.
[ - ] : equivale a un rango de caracteres.
[^ ] : excluye los caracteres que figuran entre corchetes.
{ } : introduce patrones de repetición. 
| : permite elegir entre dos expresiones.
// : delimita una expresión regular. 
\ : equivale a cualquier carácter excepto fin de línea.
\w: equivale a cualquier carácter alfanumérico y carácter _.
\W: equivale a cualquier carácter no alfanumérico.
\d: equivale a cualquier dígito.
\D: equivale a cualquier carácter no dígito.
\S: equivale a cualquier carácter menos espacio en blanco.
i: modificador para no distinguir entre mayúsculas y minúsculas.
!: excluye el carácter siguiente. 
Veamos algunos ejemplos:
[a-z]: equivale a un rango de letras minúsculas entre la a y la z.
[0-9]: equivale a un rango de dígitos entre 0 y 9.
[A-Za-z]: equivale a una letra cualquiera, ya sea mayúscula o minúscula. 
[A-Z][a-z]: equivale a una letra mayúscula seguida de una minúscula. 
[^c]: excluye el carácter c, cualquier letra que no sea la c.
[^aeiou]: excluye las vocales, es decir, equivale a cualquier consonante.
[a|b]: equivale a la letra a o a la letra b.
\w: equivale a [a-zA-Z0-9_].
\W: equivale a [^a-zA-Z0-9_].
/hola/i: representa "hola" sin distinguir mayúsculas y minúsculas.
\d: equivale a [0-9].
[!a-c]: equivale letra minúscula que no es ni a ni b ni c.
Anclas
Se refieren a la posición de la cadena.
^: comienzo de línea.
$: final de línea.
\b: principio o final de palabra.
\B: posición que no es ni al comienzo ni al final de la palabra.
<>: equivale a una palabra. 
Multiplicadores
Aluden a cuantas veces aparece en la cadena.
*: repite entre cero y más veces el carácter o subexpresión previos.
+repite entre uno y más veces el carácter o subexpresión previos.
?: repite entre cero y una vez el carácter o subexpresión previos.
{n}repite "n" veces el carácter o subexpresión previos. 
{n,m}repite entre "n" y "m" veces el carácter o subexpresión previos. 
{n,}repite al menos "n" veces el carácter o subexpresión previos. 
Sigamos con los ejemplos de anclas y multiplicadores:
^[aeiou]: una vocal al comienzo de una línea.
[aeiou]$: una vocal al final de una línea.
hola$: "hola" al final de una línea.
^$: línea vacía.
\balon: "balon" al principio o final de línea.
hola*: "hol", "hola", "holaa".
[a-z]*: una palabra en minúsculas.
^Una vez*arbol$: una línea que comienza con "una vez" y termina con "arbol".
^Una vez*[Aa]rbol$: una línea que comienza con "una vez" y termina con "Arbol" o "arbol".
hola+: "hola", "holaa", "holaaa", etc.
a{4}: "aaaa".
a{2,4}: "aa", "aaa", "aaaa".
a{2,}: "aa", "aaa", "aaaa", etc.
Lo se, un post como este valdría para ahuyentar a cualquier novato que quisiera entrar en el mundo de GNU/Linux. Quizá las expresiones regulares no sean necesarias para administrar una red doméstica o de una pequeña PYME, pero a niveles más avanzados son muy utilizadas y hacerse con ellas es fundamental. Recomiendo usar Google para encontrar construcciones más complejas y sus correspondientes explicaciones. Les dejo con un vídeo tutorial donde les explican un uso se le puede dar a las expresiones regulares.