【问题标题】:Regular Expression for Email #2电子邮件 #2 的正则表达式
【发布时间】:2013-02-12 13:36:16
【问题描述】:

我有一个正则表达式,用于检查字符串是否为电子邮件地址:

@"^((([\w]+\.[\w]+)+)|([\w]+))@(([\w]+\.)+)([A-Za-z]{1,3})$"

这适用于我测试过的所有电子邮件地址,前提是“@”之前的位至少有四个字符长。

作品:

web1@domain.co.uk

不起作用:

web@domain.co.uk

如何更改正则表达式以允许少于 4 个字符的前缀??

【问题讨论】:

  • 我刚刚运行了这两个示例,它们返回为真。如果它失败了,那一定是其他原因。
  • 对我来说效果很好。
  • 工作得很好:rubular.com/r/DMe37LGXxt
  • @Phil 我没有否决它,但它可能会被否决。如果您使用 C#,您应该尝试将电子邮件地址加载到 System.Net.Mail.MailAddress 以确定它是否是正确的电子邮件地址。
  • @Phil - 没问题 - 如果您向其中传递无效的电子邮件地址,MailAddress 类将失败,所以我通常会这样做:MailAddress m;尝试 { m = new MailAddress("test@test.com"); } catch { throw new Exception("无效的电子邮件地址"); } - 如果您使用的是 asp.net,这可以连接到 CustomValidator。这将告诉您,您的电子邮件地址至少以有效方式格式化。

标签: c# asp.net regex


【解决方案1】:

asp.net mvc 帐户模型中用于电子邮件验证的“标准”正则表达式如下:

@"^[\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$"

它允许在@前1+个字符

【讨论】:

    【解决方案2】:

    我认为检查有效电子邮件地址的最佳方法是让用户输入两次,然后向他发送一封电子邮件并质疑他使用验证链接收到该地址的事实。

    再次检查您的正则表达式,查看奇怪的有效电子邮件 addresses 列表,您会发现正则表达式不适合电子邮件验证任务。

    【讨论】:

    • 感谢您的建议,不幸的是,在使用它的情况下,这并不是一个真正的选择。然而,电子邮件将是相当标准的。
    【解决方案3】:

    我建议不要使用正则表达式来验证电子邮件(出于此处列出的原因)http://davidcel.is/blog/2012/09/06/stop-validating-email-addresses-with-regex/

    如果您无法发送确认电子邮件,在 C# 中一个不错的替代方法是尝试创建 MailAddress 并检查它是否失败。

    如果您使用的是 ASP.NET,则可以使用 CustomValidator 来调用此验证方法。

        bool isValidEmail(string email)
        {
            try
            {
                MailAddress m = new MailAddress(email);
                return true;
            }
            catch
            {
                return false;
            }
        }
    

    【讨论】:

    • 错误代码,不要依赖异常。它们很昂贵,并且在这种情况下依赖于实现。
    • 如果您有更好的电子邮件验证功能,我愿意接受建议。
    • 您的代码不能用于客户端验证,在这种情况下必须将 MVC 表单发布到服务器以执行电子邮件验证。
    【解决方案4】:

    您可以使用这个正则表达式作为替代:

    ^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$
    

    它的描述可以在here找到。

    关于您的正则表达式,开头部分 (([\w]+\.[\w]+)+) 强制电子邮件地址以四个字符开头。修正这部分 会为你做这项工作。

    【讨论】:

    • 这不是一个好邮件,john+crap@gmail.com 是一个完全有效的电子邮件
    • 嗯,这对我来说是独一无二的。为此,您可以使用以下正则表达式:^([+a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$
    • 事实上你错过了很多有效的(虽然很奇怪)地址:en.wikipedia.org/wiki/Email_address#Valid_email_addresses
    • 更不用说可能超过 6 个字符的新 tld link
    【解决方案5】:

    验证答案中使用的小技巧,即捕获异常

    new MailAddress(email);
    

    似乎不太令人满意,因为它认为“a@a”是一个有效的地址,事实上它几乎不会为任何匹配正则表达式“*.@.*”的字符串引发异常,这显然对例子

    new MailAddress("¦#°§¬|¢@¢¬|") 
    

    不会引发异常。

    因此我显然会选择正则表达式匹配

    这个例子很满意

    https://msdn.microsoft.com/en-us/library/01escwtf%28v=vs.110%29.aspx

    【讨论】:

    • 根据 RFC822,反论点是 a@a 是有效的。您可能会争辩说某些正则表达式比 RFC822 更好,但这就是 MailAddress(email) 允许它的原因。
    【解决方案6】:

    你也可以试试这个

    ^[a-zA-Z0-9._-]*@[a-z0-9._-]{2,}\.[a-z]{2,4}$
    

    【讨论】:

    • 这表示foo+bar@domain.museum 不是有效的电子邮件地址。电子邮件地址验证的正则表达式不好。
    • @CodeCaster 那么“好的”选项是什么?
    • @PhillHealey 验证电子邮件地址的一种方法是向其发送电子邮件。它非常有效,您不会阻止那些拥有您没想到的地址的人。如果你真的必须验证它,要么实现所有 RFC 选项,要么只检查(.*)@(.*)\.(.*)
    • @CodeCaster 即使这也太严格了 :) "postbox@com (顶级域是有效的主机名)" link
    • @PhillHealey 是的。最好让误报漏掉,而不是拒绝具有有效电子邮件地址但您没有预见到的用户访问。正如 fejese 所说,它甚至应该是 .+@.+
    猜你喜欢
    • 1970-01-01
    • 2011-12-28
    • 2012-01-02
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多