Regex: Menos Aterrador de lo que Parece
Las expresiones regulares tienen reputación de ser ilegibles. No tienen que serlo.
Necesitas encontrar todas las direcciones de email en un documento. O validar números de teléfono. O extraer fechas de texto desordenado.
Alguien dice "usa regex". Buscas en Google la sintaxis, encuentras algo como ^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$, e inmediatamente cierras la pestaña.
Las expresiones regulares se ven intimidantes porque la gente las escribe para ser inteligentes en lugar de claras. Arreglemos eso.
Comienza Con Coincidencia Literal
Regex encuentra patrones. El patrón más simple es texto literal.
cat coincide con "cat" en "The cat sat." Nada elegante.
http coincide con "http" en cualquier URL. Todavía directo.
Agrega Comodines Gradualmente
. coincide con cualquier carácter individual. c.t coincide con "cat", "cot", "cut".
* significa "cero o más de lo anterior". ca*t coincide con "ct", "cat", "caat", "caaaaaat".
+ significa "uno o más". ca+t coincide con "cat" y "caat" pero no "ct".
? significa "cero o uno". colou?r coincide tanto con "color" como "colour".
Las Clases de Caracteres Son tu Amiga
[aeiou] coincide con cualquier vocal. [0-9] coincide con cualquier dígito. [A-Za-z] coincide con cualquier letra.
\d es abreviación de [0-9]. \w coincide con caracteres de palabra (letras, dígitos, guión bajo). \s coincide con espacios en blanco.
Estos bloques de construcción manejan la mayoría de patrones del mundo real.
Los Anclajes Controlan Posición
^ significa "inicio de línea". $ significa "fin de línea".
^Hello coincide con "Hello world" pero no con "Say Hello".
world$ coincide con "Hello world" pero no con "world peace".
Los Grupos Capturan Partes
Los paréntesis agrupan cosas. También capturan para uso posterior.
(\d{3})-(\d{4}) coincide con "555-1234" y captura "555" y "1234" por separado.
Así es como extraes datos específicos de una coincidencia de patrón.
Ejemplos Reales, Explicados
Email (simplificado):
[\w.-]+@[\w.-]+\.\w+
Traducción: caracteres de palabra/puntos/guiones, luego @, luego más de lo mismo, luego un punto, luego caracteres de palabra.
Número de teléfono:
\d{3}[-.\s]?\d{3}[-.\s]?\d{4}
Traducción: 3 dígitos, separador opcional, 3 dígitos, separador opcional, 4 dígitos. Coincide con "555-123-4567", "555.123.4567", "5551234567".
Fecha (MM/DD/AAAA):
\d{2}/\d{2}/\d{4}
Traducción: 2 dígitos, barra, 2 dígitos, barra, 4 dígitos.
Errores Comunes
Olvidar escapar caracteres especiales. . significa "cualquier carácter" en regex. Para coincidir con un punto literal, usa \..
Ser demasiado codicioso. .* coincide tanto como sea posible. Para etiquetas HTML, <.*> en <b>bold</b> coincide con todo, no solo <b>. Usa <.*?> para coincidencia no codiciosa.
Sobre-complicar. Si necesitas validar emails de verdad, usa una biblioteca. El regex "correcto" de email tiene cientos de caracteres de largo.
Cuándo No Usar Regex
Analizar HTML o JSON. Usa un analizador apropiado.
Lógica de validación compleja. El código a menudo es más claro que un patrón masivo único.
Cuando los métodos de cadena funcionan. "hola".startsWith("ho") es más claro que /^ho/.
Regex es una herramienta. Como cualquier herramienta, es buena para trabajos específicos y torpe para otros. Comienza simple, prueba mientras construyes, y no intentes ser inteligente. Regex legible es mejor que regex impresionante.