DanLevy.net

De cero a héroe del Regex

Extraer y analizar cadenas tipo URL con una sola expresión regular

Tabla de Contenidos

TL;DR: Salta directamente a la expresión regular de más de 120 bytes.

🚀 Introducción

Extraer URLs de texto sin procesar a veces se siente como jugar a un tedioso juego de matar topos. La puntuación, los delimitadores entre paréntesis y el formato ambiguo conspiran para complicar el proceso. Ya sea que estés desarrollando un scraper web, un analizador de datos o una aplicación de chat, garantizar la precisión en la extracción de URLs es un requisito fundamental.

En esta publicación, abordaremos el problema de frente con un enfoque flexible de dos pasos. Nuestro objetivo es capturar primero todas las cadenas con aspecto de URL potenciales y luego gestionar la validación en un proceso posterior.

💡 Nota: ¡Este patrón no sirve para validar URLs! Es intencionalmente permisivo con la puntuación y los errores ortográficos.

🔍 Objetivo: Extraer URLs del texto

Al extraer URLs de texto sin procesar, un enfoque de dos pasos es efectivo:

  1. Capturar todo lo que parezca URL: Extender una red amplia para atrapar todas las cadenas que podrían ser URLs. Aquí es donde destaca nuestra “expresión regular de más de 120 bytes”.
  2. Validar: Una vez capturados estos candidatos, utiliza comprobaciones secundarias (p. ej., resolución DNS, comparación con dominios conocidos) para descartar las entradas inválidas.

Visualizar el desafío

Los términos extract y parse suelen emplearse de forma indistinta, aunque denotan procesos distintos. Extraer URLs implica identificar y capturar cadenas candidatas a partir de un texto más extenso. Por el contrario, el parse consiste en descomponer esas URLs en sus componentes.

Cuando menciono parse o “partes de una URL”, me refiero a los siguientes componentes:

Las 5 partes de cualquier URL
Anatomía de una URL, visualizada

Haz clic para ver una captura de pantalla de la coincidencia de subcadenas en RegEx101.

Antes de profundizar demasiado en la expresión regular, utilicemos una herramienta visual para verificar qué tan bien captura coincidencias múltiples nuestro patrón:

Uso de RegEx101.com para visualizar coincidencias en varias líneas
Vista previa de coincidencias masivas en varias líneas

La expresión regular de más de 120 bytes

A continuación se presenta una expresión regular compacta, diseñada para extraer y analizar URLs en un solo paso. Soporta diversos protocolos, dominios, rutas y secciones opcionales de consulta (query) y fragmento.

No te preocupes, lo desglosaremos paso a paso.

Regex de URL de más de 120 bytes
const urlRegex = /([-.a-z0-9]+:\/{1,3})([^-\/\.[\](|)\s?][^`\/\s\]?]+)([-_a-z0-9!@$%^&*()=+;/~\.]*)[?]?([^#\s`?]*)[#]?([^#\s'"`\.,!]*)/gi;
// Compatibilidad: ES5+
// Mismo patrón, dividido en líneas para mayor legibilidad:
([-.a-z0-9]+:\/{1,3})
([^-\/\.[\](|)\s?][^`\/\s\]?]+)
([-_a-z0-9!@$%^&*()=+;/~\.]*)
[?]?([^#\s`?]*)
[#]?([^#\s'"`\.,!]*)
Comparte las expresiones regulares más salvajes que hayas encontrado (o creado) en los comentarios a continuación! 🚀

🧩 Desglosando paso a paso

Diseccionamos la expresión regular en sus componentes para entender cómo opera:

1. Protocolo (Grupo 1): ([-.a-z0-9]+:/{1,3})

2. Dominio (Grupo 2): ([^-/.[](|)s?][^`/s]?]+)

3. Ruta (Grupo 3): ([-_a-z0-9!@$%^&*()=+;/~\.]*)

4. Query (Grupo 4): [?]?([^#\s`?]*)

5. Fragmento (Grupo 5): [#]?([^#\s’”`.,!]*)

🛠️ Ejemplo de análisis

Así es como puedes ejecutar este regex con un poco de JavaScript:

☑️ Siguientes pasos

Dependiendo de tu caso de uso, podrías necesitar ajustar este regex o agregar más pasos de validación y postprocesamiento.

Diferentes proyectos, diferentes necesidades

Los proyectos presentan requisitos y preocupaciones de seguridad diversos:

  1. Web Scraping: Validar URLs para garantizar accesibilidad y confianza.
  2. Procesamiento de datos: Extraer URLs de contenido generado por usuarios manteniendo controles de seguridad.
  3. Análisis de datos: Filtrar duplicados o enlaces irrelevantes para investigación o marketing.
  4. Aplicaciones para el usuario: Generar hipervínculos automáticos en chats o foros.

Postprocesamiento y validación

Una vez recopiladas las URLs candidatas, aplicar verificaciones adicionales:

📝 Resumen

Extraer datos de cadenas semiestructuradas suele ser la parte más satisfactoria del dominio de las expresiones regulares.

Aquí tienes un resumen de los puntos clave:

Al seguir estos pasos, podrás extraer de manera efectiva cualquier dato en cadena semiestructurada, sentando las bases para un posterior procesamiento y validación.

📚 Recursos para profundizar