Expresiones regulares

2020-05-04 RegExp

Las expresiones regulares (regex o regexp) son secuencias de caracteres que definen patrones de búsqueda. Son usualmente utilizadas en validaciones de datos y búsqueda y reemplazo de texto. El día de hoy veremos a grandes rasgos los elementos esenciales de las expresiones regulares y cómo construirlas.

Literales

Los literales son caracteres sin significado especial. Entre estos caracteres encontramos por ejemplo letras, números, y algunos símbolos. Básicamente, un caracter es literal sino es un metacaracter.

Metacaracteres

Los metacaracteres son caracteres no alfa-numéricos con significado especial. El objetivo de ellos es apoyar en la búsqueda de patrones. Estos caracteres son:

^ . [ ] $ ( ) | * + ? { } \

A su vez, estos caracteres pueden agruparse de acuerdo a su funcionalidad como veremos a continuación.

Cuantificadores

Los cuantificadores son caracteres especiales utilizados después de un token para indicar la cantidad de veces que puede ocurrir.

Caracter Significado
? Indica cero o una ocurrencia
* Indica cero o más ocurrencias
+ Indica una o más ocurrencias
{n} Indica exactamente n ocurrencias
{n,} Indica mínimo n ocurrencias o más
{n,m} Indica mínimo n ocurrencias y máximo m ocurrencias

Veamos algunos ejemplos.

registros?
Coincidirá con registro, registros.

ox*o
Coincidirá con oo, oxo, oxxo, ...

ho+la
Coincidirá con hola, hoola, hooola, ...

FU4{2}1
Coincidirá con FU441.

F3{2,}X
Coincidirá con F33X, F333X, F3333X, ...

78{2,3}TX
Coincidirá con 788TX, 7888TX.

Comodín

El caracter punto ( . ) coincidirá con un caractér simple. Veamos algunos ejemplos.

Z4.Q
Coincidirá con Z4aQ, Z4bQ, Z4LQ, Z4%Q, Z4*Q, ... incluso con el caracter espacio Z4 Q.

Clases o conjuntos de caracteres

Los caracteres ( [ ] ) definen un conjunto de caracteres como patrón. La coincidencia se presentará con cada caractér dentro del conjunto. Veamos algunos ejemplos.

[abc]
Coincidirá con a, b, c.

[ab12]
Coincidirá con a, b, 1, 2.

[a-z]
Coincidirá con cualquier letra minúscula individual del abecedario: a, b, c, ... z.

[a-zA-Z]
Coincidirá con cualquier letra minúscula o mayúscula individual del abecedario: a, b, c, ... z, A, B, C, ... Z.

[0-9]
Coincidirá con cualquier dígito: 0, 1, 2, ... 9.

Podemos combinar los cuantificadores con estas clases de caracteres para indicar la cantidad de veces que puede ocurrir cualquiera de los elementos del grupo.

registro[s]?
Coincidirá con registro, registros.

[abc]{3}
Coincidirá con abc, acb, bac, bca, cab, cba.

X[123456789]+
Coincidirá con X1, X2, X3, ... X11, X12, X13, ... X99, ... X999, ...

a[a-z]?
Coincidirá con a, aa, ab, ac, ... az.

También puedes realizar la negación u opuesto de una clase abreviada agregando el caracter ^.

[^0-9]
Coincidirá con cualquier caracter no dígito: f%r, ... &.

Clases de caracteres abreviadas

Debido a que hay clases de caracteres que son comúnmente utilizadas existen abreviaciones para representar dichas clases las cuales veremos a continuación.

Abreviación Clase Coincidencia
\d [0-9] Dígito
\D [^0-9] Ningún dígito
\s [ \t] Espacio o tab
\S [^ \t] Ningún espacio ni tab
\w [A-Za-z0-9_] Caracteres alfanuméricos mas el caracter "_"
\W [^A-Za-z0-9_] Ningún caracter alfanumérico ni "_"

A continuación dos ejemplos sencillos. Podrás intuir de manera fácil los demás.

\d
Coincidirá con cualquier dígito: 0, 1, 2, ... 9.

\D
Coincidirá con cualquier caracter no dígito: a, R, %, ... #.

Algunos programas de edición de texto podrían agregar clases de caracteres abreviadas particulares. Es el caso de vim con las siguientes abreviaciones.

Abreviación Clase Coincidencia
\l [a-z] Letras minúsculas
\u [A-Z] Letras mayúsculas
\a [a-zA-Z] Caracteres alfabéticos

Grupos

Los caracteres ( ( ) ) permiten agrupar segmentos de una expresión regular con el fin de aplicar cuantificadores o restricciones de alternación al grupo entero. Veamos los siguientes ejemplos.

(abc)+
Coincidirá con abc, abcabc, abcabc ...

([a-z][0-9])+
Coincidirá con pares letra-dígito una o más veces: a9, x2l6, j4t7p5, u8u7d8e8 ...

([0-9]{2}){2}
Coincidirá cuatro dígitos cualesquiera: 0000, 0109, 2019, 8439 ...

[0-9]+([.][0-9]+)?
Coincidirá con cualquier número entero o decimal: 10, 7.8, 14.5813, 0.366 ...

Alternación

La alternación permite realizar una coincidencia de una expresión regular simple de una lista de expresiones regulares. Veamos algunos ejemplos.

a|b
Coincidirá con a o b.

hola|hello|salut
Coincidirá con hola, hello, salut.

[a-z]|[0-9]
Coincidirá con una letra o dígito: a, Z, r, 8, 6 ...

#([a-z]|[0-9])#
Coincidirá con una letra o dígito encerrados por el caracter #: #a#, #Z#, #r#, #8#, #6# ...

Anclas

Las anclas no hacen coincidencia con ningún caracter en específico, su significado es meramente posicional. Estos metacaracteres indican la posición en la que se debe dar una coincidencia.

Caracter Significado
^ Debe coincidir al comienzo de la cadena
$ Debe coincidir al final de la cadena

Hasta ahora hemos visto coincidencias exactas. Sin embargo, cabe aclarar que las coincidencias se pueden dar en torno a un contexto más amplio. Observemos la siguiente expresión.

[a-z]+
Esta expresión coincidirá con cualquier palabra en minúscula como por ejemplo: hola, esperar, texto, computador, etc. Sin embargo, esta coincidencia se puede dar en un contexto de oración.

Las expresiones regulares son sencillas.

En la anterior oración encontramos cuatro coincidencias con nuestra expresión regular, la primera palabra contiene una letra mayúscula por lo cuál no entra en la coincidencia. Ahora bien, si utilizamos las anclas para delimitar la posición de nuestra coincidencia así ^[a-z]+$, la coincidencia no sería ninguna. Esto es así, porque estamos indicando que la cadena a evaluar tiene que comenzar con una letra minúscula y terminar con una letra minúscula. Veamos más ejemplos.

^[a-zA-Z]+
Esta expresión coincidirá con la primera palabra de una cadena.

Tres tristes tigres
Hola mundo
Las expresiones regulares son sencillas
588 mensajes leídos

Observa que la última línea no genera coincidencia debido a que comienza con un número.

Si te ha gustado este artículo puedes invitarme a tomar una taza de café

Acerca de Darío Rivera

Author

Ingeniero de desarrollo en PlacetoPay , Medellín. Darío ha trabajado por más de 6 años en lenguajes de programación web especialmente en PHP. Creador del microframework DronePHP basado en Zend y Laravel.

Sólo aquellos que han alcanzado el éxito saben que siempre estuvo a un paso del momento en que pensaron renunciar.