domingo, 1 de febrero de 2009

Expresiones regulares básicas

UNIX admite dos tipos de expresiones regulares: básicas y extendidas
  • las básicas son las clásicas de UNIX, aunque se consideran obsoletas en POSIX
  • aplicaciones como grep o sed las usan por defecto
  • para usar las extendidas:
    • grep --> egrep o grep -E
    • sed --> sed -r
  • las expresiones extendidas proporcionan más potencia
La mayoría de los caracteres son tratados como literales:
  • concuerdan (match) consigo mismos:
    • a concuerda con a, ab con ab, etc.
  • la excepción son los metacaracteres:
    . [ ] ^ $ * ( ) \

ER de un sólo carácter

ER concuerda con
. cualquier carácter
[ ] cualquiera de los caracteres entre corchetes, p.e. [abc] concuerda con a, b o c; [a-z] concuerda con cualquier letra minúscula
[^ ] cualquier carácter que no esté entre corchetes
^ principio de línea
$ final de línea
* 0 o más ocurrencias de la expresión regular anterior
\( \) permite agrupar ER
\ escapa un metacarácter
  • Dentro de [ ] los metacaracteres pierden su significado especial: p.e. [a.]c concuerda con ac y .c
  • Para incluir un carácter ] en una lista colocarlo al principio; para incluir un ^ en cualquier lugar menos al principio; para incluir un - al final: p.e. [a^]c concuerda con ac y ^c

Ejemplos:

ER concuerda con
a..c cadena que empiece por a, seguida por dos caracteres y c: a00c, xaxxcxx, aacc,...
0[abc]0 cadenas que tengan un 0 seguido de un carácter a, b, o c y seguido de otro 0: 0a0, 00ab0b0, bc0c0,...
0[^abc]0 cadenas que tengan un 0 seguido de un carácter distinto a a, b, o c y seguido de otro 0
0[a-z]0 cadenas que tengan un 0 seguido de una letra minúscula, y 0
^abc líneas que empiecen por abc
abc$ líneas que terminen por abc
ab*c cadenas que empiecen por a, que continúen con 0 o más b, y una c: abc, ac, abbc, aaccab,...pero no cba o aaab
b[cq]*e cadenas que empiecen por b, que continúen con 0 o más c o q, y una e: be, bcce, bccqqee o bqqqce
.* cualquier cadena
abc.* cualquier cadena que empiece por abc
0\(abc\)*0 cadenas que tengan un 0 seguido de 0 o más ocurrencias de abc, y seguido de otro 0: 0abc0, 00, 0abcabc0,..., pero no 0ac0 o 0cba0
^#.*\.$ línea que empiece por # y termine por . (notar que el segundo . está escapado por la \; la ER .* implica 0 o más caracteres cualquiera)

Repetición

Podemos repetir una regexp usando \{ \}
Constructor Propósito
\{n\} concuerda con exactamente n ocurrencias de la RE previa
\{n,\} concuerda con al menos n ocurrencias de la RE previa
\{n, m\} concuerda con entre n y m ocurrencias de la RE previa
Ejemplos:
  • a\{5\}: 5 ocurrencias del carácter a
  • .\{5,\}: al menos 5 ocurrencias de cualquier carácter