Las expresiones regulares (o regex) son una herramienta para buscar dentro de textos usando patrones.
No importa si es un JSON, un log, o un HTML gigantesco que parece sacado de una pesadilla… si es texto, regex puede meterle mano.
Y aquí viene lo interesante: el HTML es texto.
Así que sí, puedes usar regex para analizarlo, extraer cosas, o hacer scraping rápido sin necesidad de montar un parser completo.
Pero ojo: no es magia infinita. Regex es como un cuchillo afilado, útil… pero si intentas talar un árbol con él, vas a sufrir 😄
La idea básica
Una expresión regular no busca texto exacto… busca patrones.
Por ejemplo:
<img[^>]*>
Esto no busca una imagen específica, busca cualquier etiqueta <img>, sin importar sus atributos.
Es como decir:
“dame todo lo que empiece con <img y termine en > sin cruzarse con otro >”
Tus primeros bloques de construcción
Antes de lanzarnos a cosas más interesantes, necesitas entender un par de piezas clave:
1. Coincidir con cualquier cosa
[\s\S]
Esto literalmente significa:
“cualquier carácter… incluso saltos de línea”
¿Por qué no usar .?
Porque en JavaScript el . no incluye saltos de línea por defecto.
Este truco es como activar el modo “captura todo”.
2. Negar caracteres
[^>]
Esto significa:
“cualquier cosa que no sea >”
Es súper útil en HTML porque te permite moverte dentro de etiquetas sin salirte de ellas.
Cazando etiquetas HTML
Ahora sí, vamos a lo divertido.
Encontrar todas las imágenes
<img[^>]*>
Esto captura cosas como:
<img src="foto.jpg">
<img class="avatar" src="user.png" />
Da igual qué tengan dentro, mientras empiecen con <img.
Encontrar enlaces simples (una sola línea)
<a[^>]*>.*?<\/a>
Aquí pasan varias cosas:
- <a[^>]*> → abre la etiqueta
- .*? → captura contenido (modo “flojo”, para no pasarse)
- <\/a> → cierra la etiqueta
Esto funciona bien para HTML simple:
<a href="https://example.com">Click aquí</a>
Cuando el HTML se pone rebelde
El problema empieza cuando hay saltos de línea o contenido complejo.
Aquí es donde sacas la artillería pesada:
<a[^>]*>(?:(?!(<a[^>]*>|<\/a>))[\s\S])*<\/a>
Sí, se ve intimidante… pero la idea es:
“captura un <a> completo sin tragarte otro <a> dentro”
Esto evita errores cuando hay etiquetas anidadas.
Lo mismo pero con <div>
<div[^>]*>(?:(?!(<div[^>]*>|<\/div>))[\s\S])*<\/div>
Ideal para cuando quieres bloques completos sin que se desmadre el contenido interno.
Casos prácticos reales
Aquí es donde regex empieza a pagar renta.
1. Obtener la meta descripción
<meta[^>]*name=['"]description['"][^>]*>
Te sirve para scraping SEO, por ejemplo.
2. Encontrar el favicon
<link[^>]*rel=['"]icon['"][^>]*>
Útil si estás analizando sitios y quieres detectar branding o assets.
3. Buscar un elemento por ID
<[^>]*id=['"]main['"][^>]*>
Esto encuentra cualquier etiqueta con id=»main».
4. Buscar por clase (aunque esté mezclada)
<[^>]*class=['"][^>]container[^>]['"][^>]*>
Esto detecta elementos que tengan la clase container, incluso si tienen más clases:
<div class="container fluid main-layout">
5. Capturar contenido dentro de un contenedor
<[^>]*class=['"][^>]container[^>]['"][^>]*>[\s\S]*?(<\/[^>]*>)?
Esto ya se mete a nivel “quiero el bloque completo”.
Perfecto para scraping rápido de secciones.
¿Cuándo usar regex para HTML?
Aquí viene la parte honesta:
Regex funciona muy bien cuando:
- El HTML es simple o controlado
- Necesitas hacer scraping rápido
- Estás procesando strings (logs, respuestas, etc.)
- No quieres cargar un parser completo
Pero se empieza a romper cuando:
- El HTML es muy complejo o mal formado
- Hay mucha anidación
- Necesitas entender la estructura real del DOM
En esos casos, mejor usar herramientas como parsers HTML.
En resumen
- Regex sirve para encontrar patrones en texto
- HTML es texto, así que puedes analizarlo con regex
- Es ideal para tareas rápidas como scraping o validaciones
- Pero no reemplaza un parser cuando la cosa se complica