En este articulo nos vamos a centrar en sacarle el máximo partido a las expresiones regulares, las cuales son unas de las grandes olvidadas, ya que no se usan mucho pero nos pueden ayudar a encontrar, filtrar textos y encontrar coincidencias de forma rápida con la que ahorraremos tiempo y podremos validar, sustituir, remplazar o dividir contenidos. Empezamos.
¿Qué son las expresiones regulares?
Tabla de contenidos
ToggleUna expresión regular es, según su propia definición, patrones que nos permiten buscar coincidencias para validar, sustituir, remplazar o dividir contenidos. El problema es que no son intuitivas a simple vista, pero para muchos programadores son la solución para poder encontrar los datos buscados.
Como ejemplo podemos tener esta expresión regular:
^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,4})$
Sintaxis
Ya sabemos qué es una expresión regular pero antes de seguir, lo primero que vamos a explicar, es qué significa cada uno de los caracteres, ya que según su posición, o la posición de otros caracteres, estos toman unos u otros significados. Para ello es necesario conocer la sintaxis de cada uno de los caracteres los cuales vamos a ir explicando uno por uno.
Metacaracter ^
En este caso, el objetivo de este carácter es indicar que se quiere buscar algo que esté al principio de la cadena de texto que estemos buscando o al principio de la línea. Sería equivalente a decir, “queremos que empiece por…”
Ejemplo:
/^abc/
xxieo asdfa abc oasidfjasdf
abc afosdifjoasf asdifjoa
abcdeefjelsadfaf
En la primera línea, aunque existe el conjunto “abc”, no sería válido, ya que no corresponde a inicio de línea. Sin embargo las otras 2, sí, y por tanto la expresión regular, marcaría solo esos dos resultados.
Metacaracter $
En este caso, el objetivo es el inverso al anterior. Se busca que el patrón coincida con el final de una línea o con el final de la cadena. Sería útil para filtrar dominios en un listado de emails.
Ejemplo:
/abc$/
xxieo asdfa abc oasidfjasdf
abc afosdifjoasf asdifjoa
abcdeefjelsadfaf asbababc
También podemos usar, ambos a la vez, para conseguir que una cadena o una de las líneas, empiecen y acaben por lo que definamos.
Metacaracter *
Para indicar que en una parte del texto, haya 0 caracteres o más, podemos usar este carácter. De esta forma, /aa*aa/ por ejemplo, podría ser desde “aaaa” a cualquier combinación con cualquier otro carácter “aa(tantas a como sean posibles)aa”
Metacaracter +
Este carácter, sirve para lo mismo que el anterior, pero al menos, tiene que haber un carácter por lo menos, o más. Esa es la diferencia.
Metacaracter ?
Otro carácter similar a los anteriores, pero este no indica más de 1. Sólo, busca que haya un carácter o ninguno.
Metacaracter {2}
En este caso lo que se busca es que sean “2 caracteres”, y solamente 2. Cualquier otro número, también se puede utilizar.
Este, también permite combinaciones, como {3, } donde indica, 3 o más. Y también se pueden poner rangos, como por ejemplo, {3,5}
Hasta aquí, estamos definiendo repeticiones de algo. Ahora vamos a ver, como definir lo que se tiene que repetir.
Metacaracter .
Un punto, es el máximo comodín. Es decir, indica que puede ser cualquier caracter, con la excepción de una nueva línea. Combinado con los metacaracteres anteriores, podemos indicar por ejemplo que queremos un repetición concreta de caracteres.
Metacaracteres ( )
Los parentésis, sirven para definir grupos de la cadena de texto que queremos luego obtener. Por ejemplo en PHP, las funciones que hacen uso de expresiones regulares, devuelven un array con los resultados obtenidos dentro de los paréntesis.
Metacaracteres [ ]
Los corchetes, sirven para definir rangos. Por ejemplo, si queremos que la coincidencia sea de algunas letras, podemos poner [abc], por tanto, tienen que existir alguna de estas letras
Otra posibilidad es usar el “-”, para definir rangos más grandes. Por ejemplo, si queremos que las letras del rango sean todas las letras minúsculas, podemos usar lo siguiente [a-z]. ¿Queremos también añadir las mayusculas? podemos usar entonces lo siguiente [a-zA-Z]
Metacaracter |
Al igual que algunos lenguajes de programación, significa o una u otra. Por ejemplo, podemos poner (a | b) y esto significa que sea o una a o un b
Metacaracter ^ (dentro de corchetes)
Nuevamente, tenemos este metacaracter, pero atención, en este caso no significa lo mismo que en el primer punto que hemos visto. Cuando se usa de la siguiente manera, [^a] significa que la concordancia puede ser cualquier carácter excepto la letra “a”
Hasta aquí hemos detallado unos cuantos metacaracteres, pero hay más, os dejamos la siguiente imagen para que los tengáis todos.
Os podéis bajar este link, en formato pdf https://cheatography.com/davechild/cheat-sheets/regular-expressions/pdf/
Herramienta online
Y antes de seguir con los ejemplos, os pasamos un link a una web muy completa, donde podréis probar y comprobar vuestros conocimientos en expresiones regulares.
En esta página, en la parte derecha, podréis ver arriba, un hueco para definir una expresión regular.
Debajo de este hueco, hay un texto, que podéis modificar. Por tanto podréis comprobar si se marcan las coincidencias que esperáis o no.
Y por último, y casi tan importante como todo lo demás, hay una explicación del formato de la expresión regular, donde caracter a caracter te va explicando qué significa cada cosa utilizada en la expresión regular.
Ejemplos
¿Cómo determinar que una cadena de texto es un teléfono válido?
Además de “buscar” o “modificar” partes del texto ayudados por una expresión, también podemos usar las expresiones regulares para “validar” una cadena de texto.
Por ejemplo: (\+34|0034|34)?[ -]*(6|7)[ -]*([0-9][ -]*){8}
Esta expresión regular, nos ayuda a validar un teléfono. Útil en aquellos formularios donde queremos que el teléfono que nos pasen sea correcto.
Utilizando la web regexr, podemos probarlo, y comprobar que efectivamente, la expresión cumple perfectamente con su cometido.
¿Cómo validar un código de color web en formato hexadecimal?
Para este caso, podemos usar la siguiente expresión regular:
#([\dA-Fa-f]{3}){1,2}
Veamos un ejemplo con la web ya usada antes.
Y nuevamente, vemos como sólo marca los valores válidos.
¿Cómo podemos obtener del código HTML de una web, las imágenes?
Pues podemos usar la siguiente expresión
< *[img][^>]*[src] *= *[«‘]{0,1}([^»‘ >]*)
Bien, aquí hay que explicar, un concepto que hemos comentado antes, pero que no está de más recordarlo.
Como podéis ver, hay paréntesis en la expresión regular.
Por tanto, está marcando la expresión, toda la etiqueta IMG, pero además, el paréntesis nos está marcando sólo la URL de la imagen. Por tanto, en cualquier lenguaje de programación, usando esta expresión regular, nos devolvería un array con todo lo que coincide y además, la URL en otra entrada del array, por lo que podríamos guardarla o procesarla.
Por último, os animamos que exploréis esta web y probéis vuestras propias expresiones regulares.
Con todo estos conocimientos podréis,
- redireccionar URLs en vuestros servidores, usando .htaccess.
- realizar scraping de contenido web para obtener urls u otros valores de una web
- podréis validar cualquier formulario, desde emails, teléfonos, cuentas bancarias, pasaportes…
- y un largo etc…