Expresiones regulares
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.
Se pueden realizar búsquedas de caracteres literales simplemente escribiendo los caracteres en cuestión. Por ejemplo.
hola
Coincidirá con hola.
20% off
Coincidirá con 20% off.
Tú token es %&4ñ1@
Coincidirá con Tú token es %&4ñ1@.
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:
^ . [ ] $ ( ) | * + ? { } \
La diferencia con estos caracteres radica como lo dice su definición en su significado especial. La mayoría de estos caracteres no realizará una conincidencia en su búsqueda a menos que se escapen. Veamos estos ejemplos.
Los caracteres \[\] definen clases de caracteres
Coincidirá con Los caracteres [] definen clases de caracteres.
La expresión \(2n \+ 2\)\/2 siempre resulta par
Coincidirá con La expresión (2n + 2)/2 siempre resulta par.
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.