Expresiones regulares

per Victor Carceler darrera modificació 2020-03-25T15:30:22+01:00

Las expresiones regulares permiten expresar patrones de coincidencia para cadenas de texto. Se trata de un mecanismo muy potente y flexible con el que conviene estar familiarizado. Puede utilizarse en la línea de comandos mediante el filtro grep, o en diferentes lenguajes de programación como Perl, Python, Java...

Expresiones regulares simples

Una expresión regular está formada por expresiones regulares simples, una expresión regular simple puede contener:

Un carácter
La mayoría de los carácteres (letras y números) son una expresión regular que concuerda con el carácter representado. Así la expresión regular 'a' concuerda con cualquier ocurrencia del carácter 'a'. Algunos carácteres tienen un significado especial (son metacarácteres), si se les quiere desproveer de dicho significado deben escaparse precediéndolos por una contrabarra '\'. 
[...]
Una lista de carácteres encerrados entre corchetes concuerda con cualquier ocurrencia de uno de esos carácteres. Si el primer carácter de la lista es el circunflejo '^', entonces concuerda con cualquier carácter no incluido en la lista.

Es posible enumerar secuencias de carácteres utilizando el guión. Por ejemplo: [a-zA-Z] o bien [0-9]

Existen algunas clases de carácteres predefinidas:
  • [:alnum:] -> Carácteres alfanuméricos, también se puede representar por \w, y \W representa lo contrario.
  • [:alpha:] -> Carácteres alfabéticos
  • [:cntrl:] -> Códigos de control
  • [:digit:] -> Dígitos
  • [:graph:] -> Carácteres gráficos
  • [:lower:] -> Letra minúscula
  • [:print:] -> Carácter imprimible
  • [:punct:] -> Símbolo de puntuación
  • [:space:] -> Espacios y tabuladores
  • [:upper:] -> Letra mayúscula
  • [:xdigit:] -> Dígito hexadecimal
.
El punto representa a cualquier carácter excepto los que representan un salto de línea
^
Representa el inicio de línea
$
Representa el final de línea
\<
Representa el inicio de una palabra
\>
Representa el final de una palabra

Ejemplos:

  1. Buscar líneas en las que aparece la cadena 'Hola'
    cat <fichero> | grep Hola
  2. Buscar líneas en las que aparece algún dígito
    cat <fichero> | grep [[:digit:]]
    cat <fichero> | grep [0-9]
  3. Buscar líneas en las que aparece algún carácter que no es una letra mayúscula
    cat <fichero> | grep [^[:upper:]]
    cat <fichero> | grep [^A-Z]
  4. Buscar líneas que comienzan con algún dígito
    cat <fichero> | grep ^[[:digit:]]
    cat <fichero> | grep ^[0-9]
  5. Buscar líneas que terminan con letra mayúscula
    cat <fichero> | grep [[:upper:]]$
    cat <fichero> | grep [A-Z]$

 

Operadores de multiplicidad

Una expresión regular simple puede ser seguida por un operador que indique el número de veces que ha de aparecer.

Operadormultiplicidad
? El elemento precedente es opcional, y puede aparecer una vez
* El elemento precedente puede aparecer cero o más veces
+ El elemento precedente debe aparecer una o más veces
{n} El elemento precedente debe aparecer n veces
{n,} El elemento precedente aparecerá como mínimo n veces
{,n}
El elemento precedente aparecerá como máximo n veces
{n,m}
El elemento precedente aparecerá un mínimo de n y un máximo de m veces

Ejemplos:

  1. Buscar líneas en las que aparezca una o más letras 'a' seguidas de una o más letras 'b'
    cat <fichero> | grep -E a+b+
  2. Buscar líneas en las que aparezcan 3 vocales seguidas
    cat <fichero> | grep -E [aeiouAEIOU]{3}
  3. Buscar líneas en las que aparezcan hasta 3 vocales seguidas
    cat <fichero> | grep -E [aeiouAEIOU]{,3}
  4. Buscar líneas en las que aparezcan 3 vocales seguidas, pero ninguna otra vocal en toda la línea
    cat <fichero> | grep -E ^[^aeiouAEIOU]*[aeiouAEIOU]{3}[^aeiouAEIOU]*$

 

Expresiones regulares alternativas

El operador '|' permite formar expresiones regulares con alternativas a partir de subexpresiones regulares.

Por ejemplo, si se buscan líneas que cumplan alguno de los siguientes criterios:

  • Aparecen 3 vocales seguidas, pero ninguna otra vocal en toda la línea
  • Aparece la cadena 'hola'


Podemos escribir:

cat <fichero> | grep -E "^[^aeiouAEIOU]*[aeiouAEIOU]{3}[^aeiouAEIOU]*$|hola"

 

Otros detalles

  • Se pueden utilizar paréntesis para agrupar expresiones regulares y alterar la precedencia de los operadores
  • Se pueden utilizar retrorreferencias \n que concuerdan con la n-sima subexpresión entre paréntesis
  • El comando grep puede necesitar el parámetro -E para entender las expresiones regulares extendidas (con carácteres +,*,{,}...)
  • Si en el comando grep se utiliza el parámetro -v se niega el criterio de selección
  • Lea aténtamente la página de manual de grep