Primero, la respuesta corta; después, el contexto sincero: el patrón de abajo detecta errores al escribir y el correo de confirmación se ocupa de todo lo demás. Es la combinación que se usa de verdad en producción.
🎙️ Publicado y grabado:
^[\w.+-]+@[\w-]+\.[\w.-]+$
# léelo así: uno o más de [letras/dígitos/_/./+/-] @
# bloque del dominio . resto del dominio (se permiten puntos)
# anclado con ^...$ porque la validación debe cubrir TODA la cadena
# Python
import re
EMAIL_RE = re.compile(r"^[\w.+-]+@[\w-]+\.[\w.-]+$")
def looks_like_email(s):
return bool(EMAIL_RE.match(s.strip()))
// JavaScript
const EMAIL_RE = /^[\w.+-]+@[\w-]+\.[\w.-]+$/;
const looksLikeEmail = s => EMAIL_RE.test(s.trim());
✓ debe coincidir:
[email protected]
[email protected] ← el + importa (lo explicamos abajo)
[email protected]
✗ NO debe coincidir:
ada@example (sin TLD)
@example.com (sin parte local)
ada @example.com (espacio)
ada@@example.com
"ada"@example..com
[email protected] es válido y se usa a propósito: mucha gente añade etiquetas con + para saber quién ha filtrado su dirección. Rechazarlo es una forma infalible de irritar a los usuarios técnicos. El patrón de arriba lo admite; déjalo así.# sin anclas y con límites de palabra: buscar, no validar:
[\w.+-]+@[\w-]+\.[\w.-]+
re.findall(r"[\w.+-]+@[\w-]+\.[\w.-]+", big_text)
# validación = anclado ^...$. extracción = sin anclas. no los mezcles.