¿Cuál es la expresión regular más sencilla para validar correos electrónicos para no aceptarlos a ciegas? [cerrado]

80

Cuando los usuarios crean una cuenta en mi sitio, quiero hacer una validación del servidor para que los correos electrónicos no acepten todas las entradas.

Enviaré una confirmación, como una forma de hacer una validación de apretón de manos .

Estoy buscando algo simple, no lo mejor , pero no demasiado simple que no valide nada. No sé dónde debe estar la limitación, ya que cualquier expresión regular no hará la validación correcta porque no es posible hacerlo con expresiones regulares.

Estoy tratando de limitar la complejidad visual y sintaxis inherente a las expresiones regulares, porque en este caso cualquiera será correcto.

¿Qué expresión regular puedo usar para hacer eso?

eKek0
fuente
El pensamiento "más simple" era exactamente tan subjetivo como "mejor", ceteris paribus, y ese hilo tenía una cornucopia de expresiones regulares, pero si lo crees ... encoge de hombros
Mihai Limbășan
Si realiza una validación de expresiones regulares, ¿por qué limitar la expresión a algo simple? Usemos algo bueno, esto no tendrá ningún impacto en su código proporcionando mejores resultados.
twk
¿En qué parte de su aplicación estaría esta validación? ¿EN POST? ¿Qué está haciendo para desinfectar la entrada?
Braiam
^ (? i) [A-Z0-9 + _.-] + @ (?:. *). (?:. *) $, ^ denota inicio, $ denota final, (? i) coincidencia que no distingue entre mayúsculas y minúsculas. antes de @ solo permiten alfanuméricos, '+', '_', '-'. este,?: para ninguna formación de subgrupos de partidos parciales, solo 1 partido completo
P Satish Patro

Respuestas:

99
^\S+@\S+$
caos
fuente
3
Esto coincidirá con direcciones no válidas. Cualquier expresión regular lo hará, pero esta coincidirá con errores ortográficos comunes como test @ stackoverflow..com (tenga en cuenta los puntos dobles). Proporcione un mejor ejemplo.
Mihai Limbășan
62
Se supone que es un filtro extremadamente simple y muy aproximado, y no veo por qué los períodos duplicados tienen el privilegio de todos los demás errores con costos de complejidad similares para cubrirlos.
caos
2
+1. De todos modos, esta es una pregunta subjetiva, y esto es simple.
Jason Cohen
2
Sí, si no desea utilizar la expresión regular de validación completa, esta es una buena aproximación simple
rampion
8
+1 Tratar de "validar" una dirección de correo electrónico completamente a través de expresiones regulares es una tontería. Esto funciona para detectar los errores de tipo más simples; el resto se puede encontrar intentando enviar el correo. Lo anterior también permite dominios Unicode (-> Punycode), donde la mayoría de las expresiones regulares "inteligentes" fallan.
Bobince
239

Es posible escribir una expresión regular que solo acepte direcciones de correo electrónico que sigan los estándares. Sin embargo, hay algunas direcciones de correo electrónico que no siguen estrictamente los estándares, pero aún funcionan.

Aquí hay algunas expresiones regulares simples para la validación básica:

Contiene un carácter @:

@

Contiene @ y un punto en algún lugar después:

@.*?\.

Tiene al menos un carácter antes de @, antes del punto y después de él:

.+@.+\..+

Tiene solo una @, al menos un carácter antes de la @, antes del punto y después de él:

^[^@]+@[^@]+\.[^@]+$

El usuario AmoebaMan17 sugiere esta modificación para eliminar los espacios en blanco:

^[^@\s]+@[^@\s]+\.[^@\s]+$

Y por aceptar solo un período:

^[^@\s]+@[^@\s\.]+\.[^@\.\s]+$
Guffa
fuente
7
Si echas un vistazo a lo que viene con el RFC 6531 y si analizas detenidamente el RFC 3696, probablemente llegarás a la conclusión de que la única forma de validar un correo electrónico es enviar un correo electrónico de confirmación. Creo que el enfoque real con el uso de expresiones regulares en direcciones de correo electrónico debería ser ayudar al usuario a prevenir errores tipográficos y ahí es donde las expresiones regulares simples como esta entran en juego.
Bob Barker
Perfecto, @ AmoebaMan17. RegEx puede validar el formato de la dirección de correo electrónico, no puede validar el contenido de la dirección de correo electrónico. Dicho esto, el tuyo valida el formato por completo. Enviar el correo electrónico es la única forma de validar el contenido.
Craig
no funcionará [email protected]?
Abdul Hameed
1
Para evitar que la cadena termine con un punto, hice esta modificación: ^ [^ @ \ s] + @ [^ @ \ s] + \. [^ @ \. \ S] + $
fyrite
1
Sí, no uses el último. No coincide con muchas opciones válidas. [email protected] por ejemplo.
s.meijer
7

^ [a-zA-Z0-9 _. + -] + @ [a-zA-Z0-9 -] +. [a-zA-Z0-9 -.] + $

  • Solo 1 @
  • Varios dominios y subdominios
coto
fuente
3

Creo que este pequeño ajuste a la expresión de AmoebaMan17 debería evitar que la dirección comience / termine con un punto y también detener varios puntos uno al lado del otro. Intentando no volverlo complejo de nuevo mientras se elimina un problema común.

(?!.*\.\.)(^[^\.][^@\s]+@[^@\s]+\.[^@\s\.]+$)

Parece estar funcionando (pero no soy RegEx-pert). Soluciona mi problema con los usuarios que copian y pegan direcciones de correo electrónico desde el final de las oraciones que terminan con un punto.

es decir: Aquí está mi nueva dirección de correo electrónico [email protected].

Carl Howarth
fuente
Esto no funciona para un solo carácter antes del @
Andy Hoyle
<script> alert ('hola') </script> @ hello.com es válido de acuerdo con esta expresión regular. No parece estar bien.
dudedev
1

Elige tu opción.

Aquí está el que cumple con RFC 2822 Sección 3.4.1 ...

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

Por si tienes curiosidad. :)

JP Alioto
fuente
7
Solo una nota para cualquiera que vea esto ahora: Eso no cumple con RFC 2822.
Porges
11
Y tampoco es simple :)
Dan Diplo
2
También bloqueará una gran cantidad de direcciones de correo electrónico válidas. Especialmente los que usan caracteres / idiomas internacionales.
Bob Barker