用于电子邮件验证的正则表达式

时间:2009-02-03 17:34:41

标签: regex email

我已经编写了下面的正则表达式来进行非常简单的电子邮件验证。我打算发送确认链接。

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

但是,我希望从当前状态增强它,因为像这样的字符串不能产生预期的结果:

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

“测试”部分不合需要地包括在匹配中。我没有成功地尝试过单词边界。

  1. 我该如何修改?
  2. 即使我保持这么简单,是否会排除任何有效的电子邮件格式?
  3. 谢谢!

7 个答案:

答案 0 :(得分:15)

这是 很多 更复杂!!! 见Mail::RFC822::Address并且害怕......非常害怕。

答案 1 :(得分:14)

不要使用正则表达式来验证电子邮件地址

相反,来自Ben Finney撰写的mail.python.org/pipermail/python-list 1

  

当人们问“我如何验证是否有问题时,我看到的最佳建议”   电子邮件地址有效吗?“是”尝试向其发送邮件“。

     

它既是Pythonic,也是真正最好的方式。如果你真的想   确认,不要试图静态验证它; 使用电子邮件地址,   并检查结果。发送电子邮件到该地址,不要使用它   除非你得到答复说“是的,这是正确的。”   地址使用“来自收件人。

     

发送系统的邮件传输代理,而不是正则表达式,   确定将邮件发送到的域是哪个部分。

     

域名系统,而不是正则表达式,决定了什么   域名有效,主机应该接收该域名的邮件。

     

最特别的是接收邮件系统,而不是正则表达式,   确定哪些本地部分有效。

1 This is original link before it went dead

答案 2 :(得分:6)

几乎没有任何你使用的东西是短暂的,因为看起来很有意义,TRULY会验证一个电子邮件地址。话虽如此,这是我通常使用的:

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

它实际上是ASP.NET的电子邮件地址的正则表达式验证器的内置正则表达式。

注意:此线程中给出的许多正则表达式可能在90年代有效,但在当今的Web环境中,TLD允许少于2个字符且超过4个字符。例如,info @about.museum是一个有效的电子邮件地址,因为.museum是新的长TLD之一。

答案 3 :(得分:3)

我发现不是将整个电子邮件地址与正则表达式匹配,而是将字符串拆分为@和:

更为实际。
  • 首先通过DNS库检查域部分的现有MX或A记录。
  • 然后检查localpart(@左侧的部分)与更简单的正则表达式。

进行DNS检查的原因是,无法访问的电子邮件地址虽然符合RFC标准,但却毫无价值。另外检查A记录的原因是它们用于确定在没有找到MX记录时将邮件发送到何处。 (见RFC2821,3.6)

进一步提示:

  • 使用强大的DNS解析程序库,不要自己动手。针对大公司进行测试。这些有时会有大量的邮件服务器,这可能会导致问题。我在bmw.com上看过一个有问题的图书馆垃圾。只是说。 :)

答案 4 :(得分:1)

而不是。尝试匹配除\ s(空格)之外的每个字符:

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

答案 5 :(得分:0)

这来自Regex Buddy(绝对需要购买编程!)

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

答案 6 :(得分:-1)

较小的两步正则表达式提供了良好的结果

/ **检查电子邮件地址是否有效格式。      *邮箱的主要特征必须是alpha
     *剩余字符字母数字加-_和点

     *域名必须至少为2个字符
     *域名扩展名必须至少为2,不超过4 alpha      *允许子域名。      * @version 050208将撇号添加为有效字符      * @version 04/25/07单个字母的电子邮件地址和单个
     *允许使用字母域名。      * /     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
        +   "@[^\\.\\s@]"               // 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