Validar correos en el navegador con JavaScript y expresiones regulares no necesita frameworks. Con un HTML mínimo, el método String.match y cambios simples en el DOM, puedes activar un botón, dar retroalimentación visual y evitar errores de entrada. Aquí verás cómo construir la regex de forma incremental, depurarla y manejar detalles como la bandera case insensitive.
¿Cómo validar un email en JavaScript con expresiones regulares?
El objetivo es detectar si el texto en un input parece un email y, si hace match, habilitar el botón y colorear el campo. La lógica se basa en un HTML mínimo, un evento onkeyup y una función validate que opera sobre el string recibido.
¿Qué estructura mínima de HTML y JavaScript se necesita?
HTML bien formado con head, title, script, body y cierre correcto de etiquetas.
Un input de texto con name igual a email, un id y onkeyup que llama a la función validate con this.value.
Un botón con id y atributo disabled controlado desde JavaScript.
<!doctypehtml><html><head><title>JS + Regex</title><script>functionvalidate(str){console.log(str);// referencia visual en consola.// lógica de regex y DOM aquí.}</script></head><body><inputtype="text"id="in"name="email"onkeyup="validate(this.value)"><inputtype="button"id="boton"value="enviar"disabled></body></html>
¿Cómo construir la regex paso a paso sin atascarse?
Empezar simple: comprobar que exista una arroba con algo antes y después, por ejemplo .*@. para validar la idea base.
Añadir el usuario: una clase de palabra con cuantificador, por ejemplo entre 2 y 10 caracteres antes de la arroba.
Añadir el dominio: otra palabra y un punto obligatorio.
Añadir el TLD: una palabra con longitud entre 2 y 5.
Aplicar bandera case insensitive o normalizar con toLowerCase() antes del match.
Ejemplo integrado con DOM y estilos:
functionvalidate(str){// usuario: 2–10, dominio: 2–10, TLD: 2–5, con bandera i.const re =/^\w{2,10}@\w{2,10}\.\w{2,5}$/i;const input =document.getElementById('in');const boton =document.getElementById('boton');if(str.match(re)){ input.style.backgroundColor='blue'; boton.disabled=false;}else{ input.style.backgroundColor='red';// opcional: boton.disabled = true;}}
Habilidad clave: construir la expresión regular por incrementos, validando cada paso en la consola y evitando sobreingeniería temprana.
Palabras clave: String.match, bandera i (case insensitive), cuantificadores {m,n}, clases de palabra \w, TLD.
¿Qué errores comunes aparecen y cómo depurarlos?
Avanzar demasiado rápido en la regex puede bloquear el progreso. La estrategia efectiva es dividir el problema, validar desde un patrón mínimo y crecer gradualmente.
Atasco por complejidad: intentar la regex “perfecta” desde el inicio complica el debug.
Cuantificadores sin cota superior: se observó que una cota ilimitada no funcionó como se esperaba, se optó por rangos concretos como 2–5 o 2–10.
Diferencias entre motores: Chrome, Firefox y Safari pueden interpretar detalles de regex de forma distinta.
Lógica invertida con disabled: recordar que boton.disabled = false significa habilitar.
Uso de alert solo para depurar: “jamás usen alerts, más que para debuggear”.
¿Cómo depurar de forma efectiva en front end?
Imprimir el valor con console.log para saber qué entra a validate.
Reducir la regex a una comprobación mínima y rearmarla paso a paso.
Probar manualmente casos típicos: usuario, presencia de @, dominio, punto y TLD.
Confirmar el comportamiento del estilo: cambiar backgroundColor a rojo o azul para feedback inmediato.
Habilidades practicadas: depuración incremental, uso de consola, verificación visual en el DOM, control del estado de un botón.
¿Cómo mejorar la UX con cambios en el DOM al validar?
La validación no solo decide si algo es válido: también puede orientar al usuario. Un cambio de color y el estado del botón ayudan a evitar errores desde el teclado.
Input en rojo si no hay match, azul cuando el patrón se cumple.
Botón de enviar habilitado únicamente al hacer match.
Control directo del DOM con document.getElementById, element.style.backgroundColor y element.disabled.
Conceptos aplicados: eventos de teclado (onkeyup), manipulación del DOM, estilos en línea, retroalimentación inmediata.
Nota de continuidad: se anuncia el uso de la herramienta del sistema grep con expresiones regulares en un entorno de backend.
¿Tienes otra estrategia para construir la regex o un caso especial de TLD que te haya dado problemas? Comparte tu experiencia y comentemos mejoras posibles.
Para mí, ha sido de mucha ayuda que el profesor Alberto se arriesga a cometer errores. Y eso es genial..! porque enseña como afrontar esas situaciones y darles solución. Ese conocimiento es realmente muy valioso ..!
Es lo mejor de los cursos, que los mentores se equivoquen para aprender a resolver problemas. Concuerdo contigo tocayo!
Coincido con el comentario, es muy bueno el profe Alberto con su metodologia.
Hermoso compañero, espero aprender esto y más porque terminando el curso de POO iré directo a la escuela de desarrollo web!
el problema del primer intento:
^[^@_]@[\w\.]{2,}\.[\w]{2,5}$
fue que en la parte de “[^@_]” no agrego si se podía repetir, por lo tanto solo aceptaba correos con un solo carácter antes del “@” agregando corchetes, asterisco o mas, ya aceptaría funcionaria sin problemas:
El problema del minuto 12:00 no es que javascript no permita la cota superior infinita, el problema es que beco tenía la expresión para que antes del arroba tuviera entre 5 y diez caracteres alfanuméricos y a la hora de probar lo hizo con tres. 😉
efectivamente, lo probé con el siguiente código y funcionó perfectamente
<html><header><script>functionvalidate(str){if(str.match(/^\w{3,}@[\w\.]{2,}\.\w{2,5}$/)){console.log(str)document.getElementById('fldMail').style.backgroundColor='lightblue'}else{console.log('formato de correo incorrecto: ', str)document.getElementById('fldMail').style.backgroundColor='salmon'}}</script></header><body><input type="email" onkeyup="validate(this.value)" id="fldMail"></body></html>
Es verdad lo acabo de probar y funcionó
Algunas banderas de expresiones regulares en Javascript:
g: busca un patrón más de una vez.
i: caso sensitivo (ignora mayúsculas y minúsculas).
m: búsqueda en múltiples líneas.
Pueden combinarse varias banderas.
Expresiones Regulares en Javascript
No es “caso sensitivo”, es “case insensitive”
Tienes razón. Gracias 😃
Genial, sorprendido de ver como el profesor maneja diferentes tipos de lenguajes. Waauuu
Como aclaración la cota superior infinita lo he probado y si funciona en Javascript, según puedo ver en el video, en el segundo "error" lo que pasó fue que a la primera parte del correo se le aumentó el valor de la cota inferior a 5 y el profesor probó con un correo abc@gmail.com por lo que no pasaría la expresión regular
Tienes toda la razón brother yo también realice la misma prueba y es eso.
Si permite la cota superior ilimitada
Antes del curso al validar mis formularios me lleva bastante codigo y ahora con expresiones regulares totalmente fenomenal.
Con la expresión regular ya completa para validar todas las formas de Emails y con un diseño algo bonito...
Cuando dice “Evitar errores Capa #8”, se refiere a el modelo OSI, que tiene (1-7) y el “#8” seríamos nosotros, los usuarios, quienes cometamos el error (Mas información el el curso de redes)
Hola, quería comentar que el primer error es en la primer parte
de la expresión regular: ^ [^@_]@ ... $ donde no se coloca un + o *, pidiendo solo una cosa de esa clase y nada mas.
Luego quería aclarar que JavaScript si permite la cota superior infinita(lo acabo de probar yo), el error es que cuando se prueba con cota infinita se ponen 3 caracteres antes del @ (abc@...) cuando se pedían de 5 a 10, luego cuando se pone cota superior ya se ponen 5 (abcde@...) entonces hace match.
Ver a Beco en 1.25x, es como verlo en un estado alucinógeno 😅
Habitilo o deshabilito el botón "enviar" dependiendo si el correo es válido o no.
Aquí uso los agrupadores, espero les sirva de algún modo.
let str2 =`2018-06-03,South Africa,Madagascar,0,0,COSAFA Cup,Polokwane,South Africa,FALSE`;functionvalidate2(str){let regexFut =/^(20\d\d-.*),(.*),(.*),(\d+),(\d+),([\w\s]+),.*$/;let result = str.match(regexFut);console.log(`Fecha: ${result[1]}${result[2]} (${result[4]} - ${result[5]}) ${result[3]}Torneo: ${result[6]}`);}
Es comico ver como cada instructor en platzi programa tan distinto
functionvalidate(str){if(str.match(/^[^@_]+@[\w\.]{2,}\.[\w]{2,5}$/i)){//* Validando un email con una expresión regulardocument.getElementById("boton").disabled=falsedocument.getElementById("email").style.backgroundColor="green"}else{document.getElementById("boton").disabled=truedocument.getElementById("email").style.backgroundColor="red"}console.log(str)}
Evaluando con valores true false en una expresión regular más compleja para validar el email
functioncheckEmail(email){console.log(email);var re =/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/i;var result = re.test(String(email).toLowerCase());if(result){document.getElementById('boton').disabled=false;document.getElementById('email').style.backgroundColor='green';}else{document.getElementById('boton').disabled=true;document.getElementById('email').style.backgroundColor='red';}console.log(result);}