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

Regex 用于电子邮件验证的正则表达式,regex,email,Regex,Email,我编写了下面的正则表达式,用于一个非常简单的电子邮件验证。我计划发送一个确认链接 /.*@[a-z0-9.-]*/i 但是,我希望从当前状态对其进行增强,因为这样的字符串不会产生期望的结果: 测试,我的名字+test@gmail-something.co.uk,test “测试”部分被不希望地包括在比赛中。我尝试了单词边界,但没有成功 我应该如何修改 尽管我一直保持这种简单,但是否有任何有效的电子邮件格式会被排除在外 谢谢 不要使用正则表达式验证电子邮件地址 取而代之的是本·芬尼的《第一集》

我编写了下面的正则表达式,用于一个非常简单的电子邮件验证。我计划发送一个确认链接

/.*@[a-z0-9.-]*/i
但是,我希望从当前状态对其进行增强,因为这样的字符串不会产生期望的结果:

测试,我的名字+test@gmail-something.co.uk,test

“测试”部分被不希望地包括在比赛中。我尝试了单词边界,但没有成功

  • 我应该如何修改
  • 尽管我一直保持这种简单,但是否有任何有效的电子邮件格式会被排除在外

  • 谢谢

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

    取而代之的是本·芬尼的《第一集》

    当人们问“我如何验证 “电子邮件地址有效吗?”是“尝试向其发送邮件”

    这既是一种肾盂疗法,也是最好的方法。如果你真的想 确认,不要试图静态验证;使用电子邮件地址, 并检查结果。向那个地址发送电子邮件,不要使用它 除非你得到回答“是的,这是正确的” 收件人提供的“要使用的地址”

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

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

    尤其是接收邮件系统,而不是正则表达式, 确定哪些本地部件是有效的

    1

    这是一个更复杂的问题!!!
    看到并害怕…非常害怕。

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

    /**检查电子邮件地址的格式是否有效。 *邮箱的前导字符必须是alpha
    *剩余字符字母数字加-u和点
    *域基必须至少为2个字符
    *域扩展必须至少为2,不超过4 alpha
    *子域是允许的。 *@version 050208添加了撇号作为有效字符 *@version 04/25/07单封电子邮件地址和单封
    *允许使用字母域名。 */ 公共静态布尔值isValidEmailAddress(字符串地址){ 字符串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
    

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


    你使用的几乎没有一个短到足以说明问题的东西能够真正验证电子邮件地址。话虽如此,我通常使用的是:

    ^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
    
    它实际上是ASP.NET的电子邮件地址正则表达式验证程序的内置正则表达式


    注意:本线程中给出的许多正则表达式可能在90年代就已经运行,但在今天的web环境中,TLD允许小于2个字符,大于4个字符,info@about.museum是有效的电子邮件地址,因为。museum是新的长TLD之一。

    而不是。请尝试匹配除\s之外的所有字符(空白):


    我发现,与其将整个电子邮件地址与正则表达式进行匹配,不如在@和处拆分字符串:

    • 首先通过DNS库检查域部件的现有MX或A记录
    • 然后对照更简单的正则表达式检查localpart(@左侧的部分)
    进行DNS检查的原因是,尽管符合RFC,但无法访问的电子邮件地址一文不值。另外检查A记录的原因是,当未找到MX记录时,它们用于确定将邮件发送到何处。(请参阅RFC2821,3.6)

    更多提示:

    • 使用一个强大的DNS解析器库,不要使用自己的。对大公司进行测试。这些公司有时有大量的邮件服务器,这可能会导致问题。我在bmw.com上看到一个有缺陷的库。我只是说::)

    这经常出现在这里……您是否查看了输入标题后显示的问题?+1表示我将发布的链接(希望我能给出+10!)我认为这是Jeff和Joel播客大骂什么不是很好的答案的一个很好的候选人。有时你可能只是想做一些启发性的事情,98%的时候,有愚蠢电子邮件地址的人可以去吐。“有奇怪电子邮件地址的人可以去吐。”你被解雇了。有时我会告诉那些有愚蠢的正则表达式支票的网站去吐口水;永远不要再使用它们。我需要我的gmail+语法!这个链接现在好像坏了。我第一次看到这个正则表达式时,它吓了我一大跳,我把它给一个朋友看,他一开始不相信它是什么电子邮件正则表达式,然后他也被吓坏了。美好的回忆。妈妈il::RFC822::Address接受的内容远远超过通常所说的电子邮件地址。请参阅底部的注释:“此正则表达式将仅验证删除了注释并替换为空白的地址”。因此它接受空格。“”匹配\w。但域名中不允许使用“”。此外,我们现在已将域名国际化(例如阿拉伯语)。这不会将空格检查为“joe”blogs@email.com作为有效电子邮件返回。@Weggo这不允许使用空格。如果您的电子邮件允许使用空格,则可能缺少插入符号(^)在start@Rick-你的正确,我没有(^)。我有+1你的答案。它不匹配。博物馆顶级域名。要匹配除空格以外的所有内容,我们不应该匹配(大写字母S)
    \S
    ?除非它不适用于所有正则表达式引擎。方括号前面的“^”表示不在此列表中的字符。因此,它颠倒了f\S的含义。我想您可以使用“/\S*@[a-z0-9.-]*/I”代替。
    ^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
    
    /[^\s]*@[a-z0-9.-]*/i