2009-02-03 35 views
7

He escrito la expresión regular a continuación para una validación de correo electrónico realmente simple. Planeo enviar un enlace de confirmación.regex para la validación de correo electrónico

/.*@[a-z0-9.-]*/i 

Quisiera, sin embargo, que lo mejoremos desde el estado actual debido a que una cadena como esta no produce el resultado deseado:

prueba, my.name + prueba @ gmail-something.co. uk, test

La parte "prueba" está indeseablemente incluida en el juego. Experimenté con los límites de las palabras sin éxito.

  1. ¿Cómo debo modificar?
  2. Aunque he mantenido esto simple, ¿hay algún formato válido de correo electrónico que excluya?

GRACIAS!

+0

Esto ha estado aquí tan a menudo ... ¿Ha mirado las preguntas que se le mostraron después de ingresar su título? – Tomalak

+0

http://stackoverflow.com/questions/201323/what-is-the-best-regular-expression-for-validating-email-addresses/201378#201378 –

Respuesta

1

En lugar de. tratar a juego todos los personajes excepto \ s (espacio en blanco):

/[^\s]*@[a-z0-9.-]*/i 
+0

Para hacer coincidir todo, excepto el espacio en blanco, ¿no deberíamos coincidir con (capital S) '\ S'? A menos que no funcione con todos los motores de expresiones regulares. –

+0

El^al frente de los corchetes significa que los caracteres no están en esta lista. Como tal, invierte el significado f \ s. Supongo que podrías usar /\S*@[a-z0-9.-]*/i en su lugar. –

14
+0

+1 para el enlace que habría publicado (ojalá pudiera dar +10!) –

+0

Creo que este es un buen candidato para una queja sobre el podcast de Jeff y Joel sobre lo que no es una respuesta increíble. A veces puede que solo quiera una heurística para hacer algo y el 98 por ciento de las veces, las personas con direcciones de correo electrónico tontas pueden escupir. –

+3

"las personas con direcciones de correo electrónico extrañas pueden escupir" Estás despedido. – alxp

-1

Jeffrey Friedl da una expresión regular para validar direcciones de correo electrónico en su dominio de libro de las expresiones regulares. Es enorme, pero funciona bien.

15

Es un mucho más complicado !!! Ver Mail::RFC822::Address y tener miedo ... muy asustado.

+0

La primera vez que vi este Regex me asusté mucho, se lo mostré a un amigo y él no me creyó lo que era THE EMAIL REGEX al principio, y también se horrorizó. Buenos recuerdos. –

+0

Mail :: RFC822 :: Address acepta mucho más de lo que comúnmente se conoce como una dirección de correo electrónico. Vea el comentario en la parte inferior que dice: "Esta expresión regular solo validará las direcciones a las que se les quitaron los comentarios y se los reemplazó por espacios en blanco". Entonces acepta espacios en blanco. – dolmen

-1

Un menor de dos expresiones regulares paso proporciona buenos resultados

/** comprobar para ver si la dirección de correo electrónico está en un formato válido. * personaje principal de buzón debe ser alfa
* caracteres restantes alfanuméricos más -_ y dot
* base del dominio debe ser al menos 2 caracteres
* extensión de dominio debe ser al menos 2, no más de 4 alfa
* Subdominios están permitidos. * @versión 050208 añadido apóstrofo como válida char * @versión 25/04/07 dirección de correo electrónico de una sola letra y solo
* nombres de dominio de letras están permitidos. */ public static boolean isValidEmailAddress (String address) { String sRegExp;

// 050208 using the literal that was actually in place 
    // 050719 tweaked 
    // 050907 tweaked, for spaces next to @ sign, two letter email left of @ ok 
    // 042507 changed to allow single letter email addresses and single letter domain names 
    // 080612 added trap and unit test for two adjacent @signs 
    sRegExp = "[a-z0-9#$%&]"   // don't lead with dot 
     + "[a-z0-9#$%&'\\.\\-_]*"  // more stuff dots OK 
     + "@[^\\.\\[email protected]]"    // no dots or space or another @ sign next to @ sign 
     + "[a-z0-9_\\.\\-_]*"   // may or may not have more character 
     + "\\.[a-z]{2,4}";   // ending with top level domain: com,. biz, .de, etc. 

    boolean bTestOne = java.util.regex.Pattern.compile(sRegExp, 
      java.util.regex.Pattern.CASE_INSENSITIVE).matcher(address).matches(); 

    // should this work ? 
    boolean bTwoDots = java.util.regex.Pattern.compile("\\.\\.", // no adjacent dots 
        java.util.regex.Pattern.CASE_INSENSITIVE).matcher(address).find(); 

    boolean bDotBefore = java.util.regex.Pattern.compile("[\\.\\s]@", //no dots or spaces before @ 
         java.util.regex.Pattern.CASE_INSENSITIVE).matcher(address).find(); 

    return bTestOne && !bTwoDots && !bDotBefore; 
} // end IsValidEmail 
1

Puede valer la pena utilizar una expresión regular de probada eficacia. El primer enlace sugiere de expresiones regulares para la mayoría de los casos comunes:

http://www.regular-expressions.info/email.html

Pero para encontrar correctamente si la dirección es totalmente RFC822 compatible continuación:

http://instantbadger.blogspot.com/2006/08/regex-to-fully-validate-rfc822-email.html

+0

Solo otro caso en el que alguien habla ciegamente sobre Mail :: RFC822 :: Address sin verificar. – dolmen

+0

@dolmen - ¿por qué dices eso? – Kev

+0

Porque RFC822 (y RFC5822 también) no se tratan de direcciones de correo electrónico genéricas. Se trata de direcciones en el contexto SMTP, y SMTP es bastante liberal en lo que acepta. Debería pensar en toda la cadena de software que tratará con la dirección, y los agentes de transferencia de correo son solo una parte de eso. Puede esperar que no todos los programas en el camino desde su código hasta los ojos del usuario puedan manejar el conjunto RFC5822 completo. – dolmen

0

esto viene de expresiones regulares de amigos (definitivamente una necesita comprar prog!)

\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,6}\b 
+0

No coincide con el dominio de nivel superior de .museum. – dolmen

+0

@dolmen debería ahora. – Keng

6

Casi nada que uses que sea lo suficientemente corto como para que tenga sentido mirarlo VERDADERAMENTE validará una dirección de correo electrónico.Con eso se dice, esto es lo que normalmente utilizo:

^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ 

De hecho, es el construido en expresiones regulares para la validación de expresiones regulares de ASP.NET para direcciones de correo electrónico.

NOTA: muchas de las expresiones regulares dadas en este hilo PUEDEN haber funcionado en los años 90, pero los TLD tienen menos de 2 caracteres y más de 4 caracteres en el entorno web actual. Por ejemplo, [email protected] ES una dirección de correo electrónico válida porque .museum es uno de esos nuevos TLD largos.

+0

'_' coincidencias \ w. Pero '_' no está permitido en nombres de dominio. También ahora tenemos nombres de dominio internacionalizados (en árabe, por ejemplo). – dolmen

+0

Esto no marca los espacios ya que "joe [email protected]" regresa como un correo electrónico válido. – Weggo

+1

@Weggo Esto no permite espacios. Si el tuyo lo hace, es posible que te falte el cursor (^) al inicio – Rick

3

he encontrado que en lugar de hacer coincidir el conjunto dirección de correo electrónico con una expresión regular, es mucho más práctico simplemente dividir la cadena en el @ y:

  • Primero compruebe los registros MX o A existentes de la parte del dominio a través de una biblioteca DNS.
  • Luego verifique la parte local (la parte en el lado izquierdo de la @) contra una expresión regular más simple.

La razón para hacer la comprobación del DNS es que las direcciones de correo electrónico inalcanzables, aunque sean compatibles con RFC, no valen nada. La razón para verificar adicionalmente el registro A es que se usan para determinar a dónde enviar el correo cuando no se encuentra un registro MX. (Ver RFC2821, 3,6)

consejos adicionales:

  • utilizar una robusta biblioteca de resolución de DNS, no liar. Pruébalo contra grandes compañías. A veces tienen una gran cantidad de servidores de correo, lo que puede generar problemas. He visto una biblioteca defectuosa en bmw.com. Solo digo. :)
Cuestiones relacionadas