Lo básico
Las expresiones regulares (en inglés Regular Expressions) o Regex para abreviar, son cadenas de texto especiales que se utilizan para buscar y hacer coincidir patrones dentro de un texto. La sintaxis de las expresiones regulares es casi uniforme en todos los lenguajes de programación, por lo que una vez que aprendas los conceptos básicos, puedes utilizarla en cualquier lenguaje (con algunos ajustes menores).
Un problema simple
Imagina que necesitas escribir un código que pudiera determinar si una cadena determinada contiene una expresión de tiempo de 24 horas, algo así como: “Nos vemos a las 11:45” o “Corrí una maratón en 03:30“.
¿Cómo haríamos para verificar la presencia de un tiempo en la cadena y extraerlo? Podríamos hacerlo manualmente, usando bucles y un montón de lógica compleja, ¡pero no es tan fácil! No es tan simple verificar un patrón de dos números y luego dos puntos y luego dos números más. Necesitamos asegurarnos de que los tiempos sean realmente válidos en lugar de números de dos dígitos. ¿Y si quisiéramos también permitir la opción de agregar en segundos? “Corrí una maratón en 03:30:19“.
Ejemplo para buscar E-mail con expresión regular
¿Cuándo son útiles las expresiones regulares?
Las expresiones regulares en Notion se pueden usan para, reemplazar, extraer o validar cadenas de texto. A continuación vemos las funciones de Notion donde podemos usar expresiones regulares.
and(prueba lógica, prueba lógica)
Comprueba si los valores devueltos de dos pruebas lógicas son true
o no. Nos devuelve un resultado boleano. Aplicados a una propiedad esta nos muestra un checkbox que en el caso de que el resultado sea true
(verdadero) muestra este checkbox chequeado y caso contrario desactivado. Esta función devolverá true
si ambas expresiones de comparación son verdaderas y devolverá false
si una o ambas son falsas.
Ejemplo 1: and( 2 == 2, 2 == 3 )
→ false
Argumento 1: La primera expresión de comparación, debe evaluar a un valor boleano.
Argumento 2: La segunda expresión de comparación, debe evaluar a un valor boleano.
Ejemplo 2: and(prop("Prop 1"), prop("Prop 2") >= 10)
Argumento 1: En el primer argumento no hace falta poner ninguna expresión de comparación ya que el propio argumento es boleano debido a que la Propiedad “Prop 1” es de tipo Checkbox, por lo tanto el propio argumento nos proporciona un true
o un false
.
Argumento 2: El segundo argumento evalúa si el valor de la propiedad “Prop 2” en cada fila es mayor o igual a 10.
if(prueba lógica, valor, valor)
La función if() permite realizar una acción si se cumple una condición, u otra acción si la condición no se cumple. Al anidar las funciones if() (colocarlas una dentro de la otra), puedes especificar acciones para numerosas condiciones. Esta función necesita tres parámetros:
- Prueba lógica, que se evalúa como
verdadero
ofalso
. - Valor u operación a devolver si la operación si es
verdadero
. - Valor u operación a devolver si la operación si es
falso
.
Ejemplo 1: if(prop("Valor 1") > prop("Valor 2"), "Es mayor", "Es menor o igual")
Argumento 1: Evalúa si el valor de la propiedad “Valor 1” es mayor que la propiedad “Valor 2”. Solo en caso de que “Valor 1” sea mayor que “Valor 2” el resultado de la prueba lógica será true
(Verdadero).
Argumento 2: Si la prueba lógica da como resultado true
, el resultado a mostrar será “Es mayor”.
Argumento 3: Si la prueba lógica da como resultado false
, el resultado a mostrar será “Es menor o igual”.
Dado que esta fórmula anidada es un poco más compleja vamos a ver estos ejemplos en un nuevo video explicativo.
Ejemplo 2: if(prop("Valor 1") > prop("Valor 2"), "Es mayor", if(prop("Valor 1") < prop("Valor 2"), "Es menor", "Es igual"))
Argumento 1: Evalúa si el valor de la propiedad “Valor 1” es mayor que la propiedad “Valor 2”. Solo en caso de que “Valor 1” sea mayor que “Valor 2” el resultado de la prueba lógica será true
(Verdadero).
Argumento 2: Si la prueba lógica da como resultado true
, el resultado a mostrar será “Es mayor”.
Argumento 3: Si la prueba lógica da como resultado false
, como tercer argumento incluimos un nuevo if(prop("Valor 1") < prop("Valor 2"), "Es menor", "Es igual")
anidado, este if tiene a su vez tres parámetros.
not(prueba lógica)
Comprueba si la prueba lógica devuelve false
. Si la prueba lógica es false
devuelve true
y viceversa. Devuelve un boleano.
Ejemplo 1: not(2 == 3)
→ true
Ejemplo 2: not(prop("País 1") == prop("País 2"))
Ejemplo 3: not prop("País 1") == prop("País 2")
El Ejemplo 3 hace la misma función que el Ejemplo 2, de Notion cuando introducimos la expresión de la forma que vemos en el Ejemplo 2 una vez pulsamos el botón Done la cambia a como la vemos en el Ejemplo 3.
Argumento 1: La prueba lógica evualua un boleano. En este caso avalúa si 2 == 3
el resultado es false
(falso). La función devuelve el boleano contrario al resultado de la prueba lógica true
.
Ejemplo 4: if (not prop("Finalizado"), "No finalizado", "Finalizado")
En este ejemplo hemos incluido not anidado en una función if(), como vemos esta función pierde los parentesis y funciona como un operador de negación.
or(prueba lógica, prueba lógica)
Si una o ambas pruebas lógicas devuelve true
. En caso de ambas sean false
, devuelve false
. Devuelve un boleano.
Ejemplo 1: or(2==2, 1==3)
→ true
Ejemplo 2: or(2==4, 1==3)
→ false
Argumento 1: La primera expresión de comparación, debe evaluar una prueba lógica dando como resultado un valor boleano.
Argumento 2: La segunda expresión de comparación, debe evaluar una prueba lógica dando como resultado un valor boleano.
replace(texto, expresión, texto)
Reemplaza la primera coincidencia de una expresión regular dentro de una cadena de texto por un nuevo texto especificado. Devuelve una cadena de texto.
Ejemplo 1: replace( "La verdad", "La", "Es" )
→ "Es verdad"
Ejemplo 1: replace("1-2-3", "-", "!")
→ "1!2-3"
Ejemplo 3: replace(
"Mi nombre es Isabel"
,
"(?<=es ).+(?=.)", "María"
)
→ "Mi nombre es María"
)
Argumento 1: El texto original.
Argumento 2: Texto o Expresión regular (entre comillas).
Argumento 3: El texto de reemplazo.
replaceAll(texto, expresión, texto)
Reemplaza la primera coincidencia de una expresión regular dentro de una cadena de texto por un nuevo texto especificado. Devuelve una cadena de texto.
Ejemplo 1: replaceAll( "Me gusta el verano. Me gusta nadar", "Me gusta", "Me encanta" )
→ "Me encanta el verano. Me encanta nadar."
Ejemplo 2: replaceAll(prop("Nombre"), "Dra?. ", "")
→ Sustituye "Dr. " o "Dra. " que hubiera cualquier registro de la tabla por nada "", es decir los elimina.
Argumento 1: El texto original.
Argumento 2: Texto o Expresión regular (entre comillas).
Argumento 3: El texto de reemplazo.
test(prueba)
Comprueba si una cadena de texto coincide con una expresión regular. Devuelve un boleano.
Ejemplo 1: test( "Rojo, Verde, Azul", "Verde" )
→ true
Ejemplo 2: test(prop("Nombre"), "^A|^C")
→ Devuelve true para cualquier nombre que empiece por A o por C.
Argumento 1: El texto original.
Argumento 2: Texto o Expresión regular (entre comillas).
Argumento 3: El texto de reemplazo.
Intentar verificar estos patrones sin el uso de expresiones regulares es una pesadilla. Es posible, pero significa escribir toneladas de bucles y lógica compleja.
Probar y testear expresiones regulares
Es muy recomendable utilizar un editor en línea como https://regexr.com para probar tus expresiones regulares.
Códigos de caracteres
El primer grupo de caracteres especiales que veremos son los códigos de caracteres.
Regex | Descripción | Ejemplo |
---|---|---|
[abc] | Selecciona cualquiera de los caracteres que estén dentro de los corchetes. Dentro de corchetes los caracteres especiales + * ? ^ $ . [ ] { } ( ) | / tendrán su valor literal no su valor como patrón. | [T9!] → Tengo 9 años ¡Bien! |
[^abc] | Selecciona cualquiera de los caracteres que no estén dentro de los corchetes | [^aeiou] → pumpkins are orange |
[a-z] | Selecciona cualquier carácter dentro de un rango específico. Por ejemplo, el rango [a-z] incluye las letras de la a la z, pero no incluye mayúsculas, la ñ, vocales con tilde o diéresis. | [1-3a-c] → 76a321bca9z |
. | Coincide con cualquier carácter excepto los saltos de línea | . → hola mundo 1029 |
w | Selecciona cualquier carácter de este rango [A-Za-z0-9_], letras de la A a la Z mayúsculas y minúsculas, números del 0 al 9 y el caracter _. No incluye la ñ, vocales con tilde o diéresis. | w → Teléfono 503_846 123 |
d | Selecciona dígitos numéricos | d → Mi número es (+34) 955 12 45 01 |
s | Selecciona cualquier espacio en blanco (espacios, tabulaciones y saltos de línea) | s → A las tres |
Cuantificadores y más
A continuación, tenemos un grupo de caracteres especiales que nos permiten especificar la cantidad de caracteres dentro de una secuencia:
Regex | Descripción | Ejemplo |
---|---|---|
+ | Selecciona la expresión anterior 1 o más veces | A+ → HA HAAA |
* | Selecciona la expresión anterior 0 o más veces | colou*r → es color o colour o colouuuur? |
? | Selecciona la expresión anterior 0 o 1 vez | colou?r → es color o colour o colouuuur? |
{3} | Selecciona la expresión anterior repetida un número específico de veces | [a-z]{3} → Uno más dos son tres |
{1,3} | Selecciona la expresión anterior repetida las veces de un rango especificado | [a-z]{1,3} → Uno más dos son tres |
{4,} | Selecciona la expresión anterior un número específico de veces o más | !{3,} → Hola!! Bien!!! Ole!!!!! |
| | Selecciona cuaquiera de las expresiones que estén delante o detrás de | | w+rr(o|er|a) → corro cierre correr barra torre zorro |
Anclas
Regex | Descripción | Ejemplo |
---|---|---|
^ | Selecciona la expresión comenzando con el inicio de una cadena | ^[Tt] → Tiene talento |
$ | Selecciona la expresión comenzando con el final de una cadena | ja$ → jajajajajajaja |
Como hemos visto, muchos caracteres tienen significados especiales en una expresión regular. Si queremos hacer coincidir caracteres como + o ?, Podemos hacerlo pero añadiendo delante la barra inclinada (slash)
Por ejemplo, + coincidirá con un carácter + literal: d+d=d → 1+1=2 6+3=9
Esta es la lista completa de caracteres a los que necesitas añadir la barra diagonal para hacer coincidir literalmente: + * ? ^ $ . [ ] { } ( ) | /
Alrededor
Las siguientes expresiones encuentran grupos de caracteres delante o detrás pero estos no son incluidos en el resultado.
Regex | Descripción | Ejemplo |
---|---|---|
(?<=…) | Busca que haya una expresión antes de la expresión principal sin incluirla en el resultado. Si la expresión anterior no es encontrada se descarta la selección principal. | (?<=ess).+ → Su nombre es Laura |
(?=…) | Busca que haya una expresión después de la expresión principal sin incluirla en el resultado. Si la expresión de depués no es encontrada se descarta la selección principal. | .+(?=Laura)+ → Su nombre es Laura |
Agrupar
Podemos utilizar paréntesis para agrupar expresiones para usar cuantificadores o expresiones de alrededor: