Curso Básico de UNIX
Expresiones Regulares
Expresiones Regulares
Metacaracteres
Expresiones regulares básicas
Expresiones regulares de un sólo caracter
Construcción de expresiones regulares
Ejemplos de expresiones regulares básicas
Expresiones regulares extendidas
Ejemplos de expresiones regulares extendidas
Expresiones Regulares en GNU
Preguntas y Ejercicios
Bibliografía y Referencias
Expresiones Regulares.
La expresiones regulares (ER) son una forma de describir cadenas de caracteres.
Se usan en operaciones de apareamiento o comparación. Las expresiones
regulares permiten realizar búsquedas o sustituciones de gran complejidad.
Las búsquedas en el editor vi con los comandos / y ? aceptan
expresiones regulares; esto hace las búsquedas mucho más
potentes y flexibles. Las expresiones regulares son aceptadas en otros
editores y en muchos comandos, si bien con algunas diferencias de sintaxis.
Una expresión regular es un patrón que describe un conjunto
de cadenas de caracteres. Por ejemplo, el patrón aba*.txt
describe el conjunto de cadenas de caracteres que comienzan con aba,
contienen cualquier otro grupo de caracteres, luego un punto, y finalmente
la cadena txt. El símbolo * se interpreta como "0, 1 o
más caracteres cualesquiera".
Las expresiones regulares se construyen como las expresiones aritméticas,
usando operadores para combinar expresiones más pequeñas.
Analizaremos esos operadores y las reglas de construcción de expresiones
regulares, atendiendo siempre al conjunto de cadenas que representa cada
patrón.
Metacaracteres.
La construcción de expresiones regulares depende de la asignación
de significado especial a algunos caracteres. En el patrón aba*.txt
el caracter * no vale por sí mismo, como el caracter asterisco,
sino que indica un "conjunto de caracteres cualesquiera". Asimismo, el
caracter ? no se interpreta como el signo de interrogación sino
que representa "un caracter cualquiera y uno solo". Estos caracteres a
los que se asigna significado especial se denominan "metacaracteres".
El conjunto de metacaracteres para expresiones regulares es el siguiente:
\ ^ $ . [ ] { } | ( ) * + ?
Estos caracteres, en una expresión regular, son interpretados
en su significado especial y no como los caracteres que normalmente representan.
Una búsqueda que implique alguno de estos caracteres obligará
a "escaparlo" de la interpretación mediante \, como se hace para
evitar la interpretación por el shell de los metacaracteres del
shell. En una expresión regular, el caracter ? representa
"un caracter cualquiera"; si escribimos \?, estamos representando el caracter
? tal cual, sin significado adicional.
Expresiones Regulares Básicas.
Una expresión regular determina un conjunto de cadenas de caracteres.
Un miembro de este conjunto de cadenas se dice que aparea, equipara o satisface
la expresión regular.
ERs de un sólo caracter.
Las expresiones regulares se componen de expresiones regulares elementales
que aparean con un único caracter:
|
Exp.Reg.
|
aparea con
|
|
c
|
ER que aparea con el caracter ordinario c
|
|
.
|
(punto) ER que aparea con un caracter cualquiera excepto nueva línea
|
|
[abc]
|
ER de un caracter que aparea con a, b o c
|
|
[^abc]
|
ER de un caracter que no sea a, b o c
|
|
[0-9][a-z][A-Z]
|
ERs de un caracter que aparean con cualquier caracter en el intervalo indicado.
El signo - indica un intervalo de caracteres consecutivos.
|
| \e |
ER que aparea con alguno de estos caracteres (en lugar de la e):
. * [ \ cuando no están dentro de [
]
^ al principio
de la ER, o al principio dentro de [ ]
$ al final de
una ER
/ usado para
delimitar una ER |
Los paréntesis rectos [] delimitan listas de caracteres
individuales. Muchos metacaracteres pierden su significado si están
dentro de listas: los caracteres especiales . * [ \ valen por
sí dentro de []. Para incluir un caracter ] en
una lista, colocarlo al principio; para incluir un ^ colocarlo
en cualquier lugar menos al principio; para incluir un - colocarlo
al final.
Dentro de los conjuntos de caracteres individuales, se reconocen las
siguientes categorías:
[:alnum:] alfanuméricos
[:alpha:] alfabéticos
[:cntrl:] de control
[:digit:] dígitos
[:graph:] gráficos
[:lower:] minúsculas
[:print:] imprimibles
[:punct:] de puntuación
[:space:] espacios
[:upper:] mayúsculas
[:xdigit:] dígitos hexadecimales
Por ejemplo, [[:alnum:]] significa [0-9A-Za-z], pero
esta última expresión depende de la secuencia de codificación
ASCII, en cambio la primera es portable, no pierde su significado bajo
distintas codificaciones. En los nombres de categorías, los paréntesis
rectos forman parte del nombre de la categoría, no pueden ser omitidos.
Construcción de Expresiones Regulares.
Una Expresión Regular se contruye con uno o más operadores
que indican, cada uno, el caracter a buscar. Los operadores más
comunes y aceptados son los siguientes:
| Operador |
Significado |
| c |
un caracter no especial concuerda consigo mismo |
| \c |
elimina significado especial de un caracter c; el \ escapa el significado
especial |
| ^ |
indica ubicado al comienzo de la línea (cadena nula al principio
de línea) |
| $ |
indica ubicado al final de la línea (cadena nula al final de
línea) |
| . |
(punto) un caracter individual cualquiera |
| [...] |
uno cualquiera de los caracteres ...; acepta intervalos del tipo a-z,
0-9, A-Z (lista) |
| [^...] |
un caracter distinto de ... ; acepta intervalos del tipo a-z, 0-9,
A-Z |
| r* |
0, 1 o más ocurrencias de la ER r (repetición) |
| r1r2 |
la ER r1 seguida de la ER r2 (concatenación) |
Ejemplos de Expresiones Regulares Básicas.
Las expresiones regulares se aprenden mejor con los ejemplos y el uso.
| Exp.Reg. |
aparea con |
| a.b |
axb aab abb aSb a#b ... |
| a..b |
axxb aaab abbb a4$b ... |
| [abc] |
a b c (cadenas de un caracter) |
| [aA] |
a A (cadenas de un caracter) |
| [aA][bB] |
ab Ab aB AB (cadenas de dos caracteres) |
| [0123456789] |
0 1 2 3 4 5 6 7 8 9 |
| [0-9] |
0 1 2 3 4 5 6 7 8 9 |
| [A-Za-z] |
A B C ... Z a b c ... z |
| [0-9][0-9][0-9] |
000 001 .. 009 010 .. 019 100 .. 999 |
| [0-9]* |
cadena_vacía 0 1 9 00 99 123 456 999 9999 ... |
| [0-9][0-9]* |
0 1 9 00 99 123 456 999 9999 99999 99999999 ... |
| ^.*$ |
cualquier línea completa |
En el editor vi, las expresiones regulares permiten realizar
búsquedas tales como:
/^Desde
busca líneas que empiecen con la cadena Desde
/final$
busca líneas que termine con la cadena final
/\$25
busca líneas que contengan $25; \ escapa el $
Expresiones Regulares Extendidas.
Algunos comandos, como egrep o grep -E, aceptan Expresiones
Regulares Extendidas, que comprenden las Expresiones Regulares Básicas
más algunos operadores que permiten construcciones más complejas.
Los operadores incorporados son los siguientes:
| Operador |
Significado |
| r+ |
1 o más ocurrencias de la ER r |
| r? |
0 o una ocurrencia de la ER r, y no más |
| r{n} |
n ocurrencias de la ER r |
| r{n,} |
n o más ocurrencias de la ER r |
| r{,m} |
0 o a lo sumo m ocurrencias de la ER r |
| r{n,m} |
n o más ocurrencias de la ER r, pero a lo sumo m |
| r1|r2 |
la ER r1 o la ER r2 (alternativa) |
| (r) |
ER anidada |
| "r" |
evita que los caracteres de la ER r sean interpretados por el shell |
La repetición tiene precedencia sobre la concatenación;
la concatenación tiene precedencia sobre la alternativa. Una expresión
puede encerrarse entre paréntesis para ser evaluada primero.
Ejemplos de Expresiones Regulares Extendidas:
| Exp.Reg.Ext. |
aparea con |
|
[0-9]+
|
0 1 9 00 99 123 456 999 9999 99999 99999999 ..
|
|
[0-9]?
|
cadena_vacía 0 1 2 .. 9
|
|
^a|b
|
a b
|
|
(ab)*
|
cadena_vacía ab abab ababab ...
|
|
^[0-9]?b
|
b 0b 1b 2b .. 9b
|
|
([0-9]+ab)*
|
cadena_vacía 1234ab 9ab9ab9ab 9876543210ab 99ab99ab ...
|
Expresiones regulares en GNU.
En GNU, no se distinguen expresiones regulares básicas de extendidas;
los comandos aceptan todas las expresiones regulares. En ese caso, como
siempre se están usando extendidas, los metacaracteres ?, +, {,
|, (, y ) deben ser escapados cuando se quieren usar como caracteres normales,
escribiendo \?, \+, \{, \|, \(, y \).
Bibliografía y Referencias.
Referencias: Kernighan-Pike[1987], Coffin[1989]
Víctor A. González Barbone vagonbar en fing edu uy
Instituto de Ingeniería Eléctrica
- Facultad de Ingeniería -
Montevideo, Uruguay.