Qué es una expresión regular?
Una expresión regular es un grupo de caracteres o símbolos, los cuales son usados para buscar un patrón específico dentro de un texto.
Una expresión regular es un patrón que que se compara con una cadena de caracteres de izquierda a derecha. La palabra "expresión regular" puede también ser escrita como "Regex" o "Regexp". Las expresiones regulares se utilizan para remplazar un texto dentro de una cadena de caracteres (string), validar formularios, extraer una porción de una cadena de caracteres (substring) basado en la coincidencia de una patrón, y muchas cosas más.
Imagina que estás escribiendo una aplicación y quieres agregar reglas para cuando el usuario elija su nombre de usuario. Nosotros queremos permitir que el nombre de usuario contenga letras, números, guión bajo (raya), y guión medio. También queremos limitar el número de caracteres en el nombre de usuario para que no se vea feo. Para ello usamos la siguiente expresión regular para validar el nombre de usuario.
Start of the line
| 3 to 15 characters long
| |
| |
^[a-z0-9_-]{3,15}$
| |
| |
| End of the line
letters, numbers, underscores, hyphens
La expresión regular anterior puede aceptar las cadenas john_doe
, jo-hn_doe
y john12_as
. Sin embargo, la expresión no coincide con el nombre de usuario Jo
porque es una cadena de caracteres que contiene letras mayúsculas y es demasiado corta.
Tabla de contenido
1. Introducción
Una expresión regular es sólo un patrón de caracteres que utilizamos para realizar búsquedas en un texto. Por ejemplo, la expresión regular the
significa: la letra t
, seguida de la letra h
, seguida de la letra e
.
"the" => The fat cat sat on the mat.
La expresión regular 123
coincide con la cadena 123
. La expresión regular se compara con una cadena de entrada al comparar cada carácter de la expresión regular con cada carácter de la cadena de entrada, uno tras otro. Las expresiones regulares son normalmente sensibles a mayúsculas y minúsculas, por lo que la expresión regular The
no coincide con la cadena the
.
"The" => The fat cat sat on the mat.
2. Meta-caracteres
Los meta-caracteres son los bloques de construcción de las expresiones regulares. Los meta-caracteres no se sostienen a sí mismos, sino que se interpretan de alguna manera especial. Algunos meta-caracteres tienen un significado especial y se escriben entre corchetes. Los meta-caracteres son los siguientes:
Meta-carácter | Descripción |
---|---|
. | Período. Coincide con cualquier carácter excepto un salto de línea. |
[ ] | Clase de caracteres. Coincide con cualquier carácter contenido entre corchetes. |
[^ ] | Clase de caracteres negados. Coincide con cualquier carácter que no está contenido dentro de los corchetes. |
* | Corresponde con 0 o más repeticiones del símbolo precedente. |
+ | Corresponde con 1 o más repeticiones del símbolo precedente. |
? | Hace que el símbolo precedente sea opcional. |
{n,m} | Llaves. Corresponde al menos "n" pero no más de "m" repeticiones del símbolo precedente. |
(xyz) | Grupo carácter. Hace coincidir los caracteres xyz en ese orden exacto. |
| | Alternancia. Corresponde a los caracteres anteriores o los caracteres después del símbolo. |
\ | Escapa el siguiente carácter. Esto le permite hacer coincidir los caracteres reservados [ ] ( ) { } . * + ? ^ $ \ | |
^ | Hace coincidir el principio de la entrada. |
$ | Corresponde al final de la entrada. |
2.1 Full stop
Full stop .
es el ejemplo más simple del meta-carácter. El meta-carácter .
coincide con cualquier carácter. No coincidirá con el retorno o nuevos caracteres de línea. Por ejemplo, la expresión regular .ar
significa: cualquier carácter, seguido del carácter a
, seguido del carácter r
.
".ar" => The car parked in the garage.
2.2 Conjunto de caracteres
Los conjuntos de caracteres también se llaman clase de caracteres. Los corchetes se utilizan para especificar conjuntos de caracteres. Utilice un guión dentro de un conjunto de caracteres para especificar el rango de los caracteres. El orden del rango de caracteres dentro de corchetes no importa. Por ejemplo, la expresión regular [Tt]he
significa: un carácter en mayúscula T
o minúscula t
, seguido del carácter h
, seguido del carácter e
.
"[Tt]he" => The car parked in the garage.
Sin embargo, un período dentro de un conjunto de caracteres significa un período literal. La expresión regular ar[.]
significa: un carácter en minúscula a
, seguido del carácter r
, seguido del carácter .
.
"ar[.]" => A garage is a good place to park a car.
2.2.1 Conjunto de caracteres negados
En general, el símbolo de intercalación representa el comienzo de la cadena, pero cuando se escribe después del corchete de apertura niega el conjunto de caracteres. Por ejemplo, la expresión regular [^c]ar
significa: cualquier carácter, excepto c
, seguido del carácter a
, seguido del carácter r
.
"[^c]ar" => The car parked in the garage.
2.3 Repeticiones
Los siguientes caracteres meta +
, *
o ?
, se utilizan para especificar cuántas veces puede producirse un subpatrón. Estos meta-caracteres actúan de manera diferente en diferentes situaciones.
2.3.1 Asterisco
El símbolo *
coincide con cero o más repeticiones del marcador anterior. La expresión regular a*
significa: cero o más repeticiones del carácter en minúscula precedente a
. Pero si aparece después de un conjunto de caracteres o una clase, entonces encuentra las repeticiones de todo el conjunto de caracteres. Por ejemplo, la expresión regular [a-z]*
significa: cualquier número de letras minúsculas en una fila.
"[a-z]*" => The car parked in the garage #21.
El símbolo *
se puede utilizar con el meta-carácter .
para que coincida con cualquier cadena de caracteres .*
. El símbolo *
se puede utilizar con el carácter de espacio en blanco \s
para que coincida con una cadena de caracteres de espacio en blanco. Por ejemplo, la expresión \s*cat\s*
significa: cero o más espacios, seguido por el carácter en minúscula c
, seguido del carácter en minúscula a
, seguido del carácter en minúscula t
, seguido de cero o más espacios.
"\s*cat\s*" => The fat cat sat on the concatenation.
2.3.2 Signo más
El símbolo +
coincide con una o más repeticiones del carácter anterior. Por ejemplo, la expresión regular c.+T
significa: carácter en minúscula c
, seguido por lo menos de un carácter, luego el carácter en minúscula t
.
"c.+t" => The fat cat sat on the mat.
2.3.3 Signo de interrogación
En expresiones regulares el meta-carácter ?
hace que el carácter precedente sea opcional. Este símnbolo coincide con cero o una instancia del carácter precedente. Por ejemplo, la expresión regular [T]?he
significa: El carácter opcional T
seguido por el carácter en minúscula h
, seguido del carácter en minúscula e
.
"[T]he" => The car is parked in the garage.
"[T]?he" => The car is parked in the garage.
2.4 Llaves
En la expresión regular, las llaves, que también se denominan cuantificadores, son utilizados para especificar el número de veces que se puede repetir un carácter o un grupo de caracteres. Por ejemplo, la expresión regular [0-9]{2,3}
significa: Combina al menos 2 dígitos pero no más de 3 (caracteres en el rango de 0 a 9).
"[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0.
Podemos dejar fuera el segundo número. Por ejemplo, la expresión regular [0-9] {2,}
significa: Combina 2 o más dígitos. Si también eliminamos la coma, la expresión regular [0-9]{3}
significa: coincidir exactamente con 3 dígitos.
"[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0.
"[0-9]{3}" => The number was 9.9997 but we rounded it off to 10.0.
2.5 Grupos de caracteres
Un grupo de caracteres es un grupo de sub-patrones que se escribe dentro de paréntesis (...)
. Como hemos discutido antes en la expresión regular, si ponemos un cuantificador después de un carácter, repetiremos el carácter anterior. Pero si ponemos un cuantificador después de un grupo de caracteres, entonces repetimos todo el grupo de caracteres. Por ejemplo, la expresión regular (ab)*
coincide con cero o más repeticiones del caracter ab
. También podemos usar el carácter de alternancia |
meta dentro del grupo de caracteres. Por ejemplo, la expresión regular (c|g|p)ar
significa: carácter en minúscula c
, g
o p
, seguido del carácter a
, seguido del carácter r
.
"(c|g|p)ar" => The car is parked in the garage.
2.6 Alternancia
En la expresión regular, la barra vertical |
se utiliza para definir la alternancia. La alternancia es como una condición entre múltiples expresiones. Ahora, puedes estar pensando que el conjunto de caracteres y la alternancia funciona de la misma manera. Sin embargo, la gran diferencia entre el conjunto de caracteres y la alternancia es que el conjunto de caracteres funciona a nivel de carácter pero la alternancia funciona a nivel de expresión. Por ejemplo, la expresión regular (T|t)he|car
significa: el carácter en mayúscula T
o en minúscula t
, seguido del carácter en minúscula h
, seguido del carácter en minúscula e
o del carácter en minúscula c
, seguido de un carácter en minúscula a
, seguido del carácter en minúscula r
.
"(T|t)he|car" => The car is parked in the garage.
2.7 Caracteres especiales de escape
La barra invertida \
se utiliza en la expresión regular para escapar el carácter siguiente. Esto permite especificar un símbolo como un carácter coincidente incluyendo caracteres reservados {}[]/\+*.^|?
. Para usar un carácter especial como un carácter coincidente, agrega \
a su izquierda.
Por ejemplo, la expresión regular .
se utiliza para coincidir con cualquier carácter, excepto la nueva línea. Ahora, para emparejar .
en una cadena de entrada, la expresión regular (f|c|m)at\.?
significa: el carácter en minúscula f
, c
o m
, seguido del carácter en minúscula a
, seguido del carácter en minúscula t
, seguido del carácter opcional .
.
"(f|c|m)at\.?" => The fat cat sat on the mat.
2.8 Anclas
En expresiones regulares, usamos anclas para comprobar si el símbolo coincidente es el símbolo inicial o el símbolo final de la cadena de entrada. Los anclajes son de dos tipos: El primer tipo es el símbolo de intercalación ^
que comprueba si el carácter coincidente es el carácter inicial de la entrada y el segundo tipo es el símbolo del dólar $
que comprueba si el carácter coincidente es el último carácter de la cadena de entrada.
2.8.1 Símbolo de intercalación
El símbolo de intercalación ^
se usa para verificar si el carácter coincidente es el primer carácter de la cadena de entrada. Si aplicamos la siguiente expresión regular ^a
(si a
es el símbolo inicial) a la cadena de entrada, abc
coincide con a
. Pero si aplicamos la expresión regular ^b
en la cadena de entrada anterior, no coincide con nada. Porque en la cadena de entrada abc
, b
no es el símbolo inicial. Vamos a echar un vistazo a la expresión regular ^(T|t)he
que significa: carácter en mayúscula T
o carácter en minúscula t
es el símbolo inicial de la cadena de entrada, seguido del carácter minúscula h
y seguido del carácter en minúscula e
.
"(T|t)he" => The car is parked in the garage.
"^(T|t)he" => The car is parked in the garage.
2.8.2 Símbolo del dólar
El símbolo del dólar $
se utiliza para comprobar si el carácter coincidente es el último carácter de la cadena de entrada. Por ejemplo, la expresión regular (at\.)$
significa: un carácter en minúscula a
, seguido del carácter en minúscula t
, seguido de un carácter .
y el marcador debe ser el final de la cadena.
"(at\.)" => The fat cat. sat. on the mat.
"(at\.)$" => The fat cat. sat. on the mat.
3. Conjunto de caracteres abreviados
La expresión regular proporciona abreviaturas para los conjuntos de caracteres comúnmente utilizados, que ofrecen abreviaturas convenientes para expresiones regulares de uso común. Los conjuntos de caracteres abreviados son los siguientes:
Abreviatura | Descripción |
---|---|
. | Cualquier carácter excepto nueva línea |
\w | Coincide con los caracteres alfanuméricos: [a-zA-Z0-9_] |
\W | Coincide con los caracteres no alfanuméricos: [^\w] |
\d | Coincide con dígitos: [0-9] |
\D | Coincide con no dígitos: [^\d] |
\s | Coincide con caracteres espaciales: [\t\n\f\r\p{Z}] |
\S | Coincide con caracteres no espaciales: [^\s] |
4. Mirar alrededor
Mirar hacia delante (lookahead) y mirar hacia atrás (lookbehind), a veces conocidos como lookaround, son tipo específico de grupo que no captura (Utilizados para coincidir con el patrón pero no se incluyen en la lista correspondiente). Los lookaheads se usan cuando tenemos la condición de que este patrón es precedido o seguido por otro patrón determinado. Por ejemplo, queremos obtener todos los números que están precedidos por el carácter $
de la siguiente cadena de entrada $4.44 y $10.88
. Usaremos la siguiente expresión regular (?<=\$)[0-9\.] *
, esto significa: obtener todos los números que contienen el carácter .
y están precedidos del carácter $
. A continuación se muestran los lookarounds que se utilizan en expresiones regulares:
Símbolo | Descripción |
---|---|
?= | Lookahead Positivo |
?! | Lookahead Negativo |
?<= | Lookbehind Positivo |
?<! | Lookbehind Negativo |
4.1 Mirar hacia adelate positiva
El lookahead positivo afirma que la primera parte de la expresión debe ser seguida por la expresión lookahead. La coincidencia devuelta sólo contiene el texto que coincide con la primera parte de la expresión. Para definir un lookahead positivo, se utilizan paréntesis. Dentro de esos paréntesis, un signo de interrogación con signo igual se utiliza de esta manera: (?= ...)
. La expresión de Lookahead se escribe después del signo igual dentro de los paréntesis. Por ejemplo, la expresión regular [T|t]he (?=\Sfat)
significa: opcionalmente emparejar el carácter en minúscula t
o el carácter en mayúscula T
, seguida del carácter h
, seguida del carácter e
. Entre paréntesis definimos el lookahead positivo que indica al motor de expresión regular que coincida con The
o the
seguido de la palabra fat
.
"[T|t]he(?=\sfat)" => The fat cat sat on the mat.
4.2 Mirar hacia adelate negativa
El lookahead negativo se usa cuando necesitamos obtener todas las coincidencias de la cadena de entrada que no son seguidas por un patrón. El aspecto negativo se define de la misma manera que definimos el aspecto positivo, pero la única diferencia es que en lugar del carácter igual =
utilizamos carácter negación !
, es decir, (?! ...)
. Vamos a echar un vistazo a la siguiente expresión regular [T|t]he(?!\Sfat)
que significa: obtener todas las The
o the
seguidos por la palabra fat
precedido por un carácter de espacio.
"[T|t]he(?!\sfat)" => The fat cat sat on the mat.
4.3 Mirar hacia atras positiva
Positivo lookbehind se utiliza para obtener todos los caracteres que están precedidos por un patrón específico. La apariencia positiva se denotar por (?<=...)
. Por ejemplo, la expresión regular (? <= [T|t]he\s)(fat|mat)
significa: obtener todas las palabras fat
o mat
de la cadena de entrada después de la palabra The
o the
.
"(?<=[T|t]he\s)(fat|mat)" => The fat cat sat on the mat.
4.4 Mirar hacia atras negativa
El lookbehind negativo se utiliza para obtener todas las coincidencias que no están precedidas por un patrón específico. El lookbehind negativo se denota por (? <! ...)
. Por ejemplo, la expresión regular (?<!(T|t)he(s)(cat)
significa: obtener todas las palabras cat
de la cadena de entrada que no están después de la palabra The
o the
.
"(?<![T|t]he\s)(cat)" => The cat sat on cat.
5. Indicadores
Los indicadores también se llaman modificadores porque modifican la salida de una expresión regular. Estos indicadores se pueden utilizar en cualquier orden o combinación, y son una parte integral de RegExp.
Indicador | Descripción |
---|---|
i | Insensible a mayúsculas y minúsculas: Ajusta la coincidencia para que no distinga mayúsculas y minúsculas. |
g | Búsqueda global: Busca un patrón en toda la cadena de entrada. |
m | Multilínea: Ancla meta carácter trabaja en cada línea. |
5.1 Mayúscula y minúscula
El modificador i
se utiliza para realizar la coincidencia entre mayúsculas y minúsculas. Por ejemplo, la expresión regular /The/gi
significa: carácter en mayúscula T
, seguido del carácter en minúscula h
, seguido del carácter e
. Y al final de la expresión regular, el indicador i
indica al motor de expresiones regulares que ignore el caso. Como puede ver, también proveimos el indicador g
porque queremos buscar el patrón en toda la cadena de entrada.
"The" => The fat cat sat on the mat.
"/The/gi" => The fat cat sat on the mat.
5.2 Búsqueda global
El modificador g
se utiliza para realizar una coincidencia global (encontrar todos las coincidencias en lugar de detenerse después de la primera coincidencia). Por ejemplo, la expresión regular /.(At)/g
significa: cualquier carácter, excepto la nueva línea, seguido del carácter en minúscula a
, seguido del carácter en minúscula t
. Debido a que proveimos el indicador g
al final de la expresión regular, ahora encontrará todas las coincidencias de toda la cadena de entrada, no sólo la primera instancia (el cual es el comportamiento normal).
"/.(at)/" => The fat cat sat on the mat.
"/.(at)/g" => The fat cat sat on the mat.
5.3 Multilínea
El modificador m
se utiliza para realizar una coincidencia de varias líneas. Como analizamos anteriormente, las anclas (^,$)
se utilizan para comprobar si el patrón es el comienzo de la entrada o el final de la cadena de entrada. Pero si queremos que las anclas funcionen en cada línea usamos el indicador m
. Por ejemplo, la expresión regular /at(.)?$/Gm
significa: carácter en minúscula a
, seguido del carácter en minúscula t
, opcionalmente cualquier cosa menos la nueva línea. Y debido al indicador m
, ahora el motor de expresión regular coincide con el patrón al final de cada línea de una cadena.
"/.at(.)?$/" => The fat cat sat on the mat.
"/.at(.)?$/gm" => The fat cat sat on the mat.
Muchas gracias a ziishaned