相对于 mailAddress 类,Regex 是不是稳定用于电子邮件验证?

Posted

技术标签:

【中文标题】相对于 mailAddress 类,Regex 是不是稳定用于电子邮件验证?【英文标题】:Is Regex stable to use for email validation oppsed to the mailAddress Class?相对于 mailAddress 类,Regex 是否稳定用于电子邮件验证? 【发布时间】:2017-10-15 17:13:28 【问题描述】:

我有这个功能可以正常工作,但是有没有更简单的方法可以使用邮件地址类完成验证检查,它会更合适吗?提前致谢。

        TextBox tb = new TextBox();
        tb.KeyDown += new KeyEventHandler(txtEmail_KeyDown);

        string strRegex = @"^(?("")("".+?(?<!\\)""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\\\|~\w])*)(?<=[0-9a-z])@))" + @"(?(\[)(\[(\d1,3\.)3\d1,3\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]0,22[a-z0-9]))";

        Regex re = new Regex(strRegex); // New regex Object  created 

        // Run Checks after the enter is pressed.
        if (e.KeyCode == (Keys.Enter))
        
            // checks for is match, if empty and length 
            if (!re.IsMatch(txtEmail.Text) || (txtEmail.Text.Equals("")) || txtEmail.Text.Length > 100)
            
                // display messagebox with error
                MessageBox.Show("Email not correct format!!!! ");
            
            else
            
                MessageBox.Show("Email Format is correct");
            
        

    

【问题讨论】:

这取决于您使用的正则表达式,因为有很多情况需要检查您是否要使用正则表达式限制输入 使用 mailAddress 类会更有效吗?以及上面检查所有 tld 的示例正则表达式怎么样 见那里:***.com/questions/36035941/… 【参考方案1】:

您可以像在 c# 中这样轻松地使用 EmailAddressAttribute 类进行验证

public bool ValidateEmail(string EmailToVerify)

  if (new EmailAddressAttribute().IsValid(EmailToVerify))
        return true;
  else 
        return false;

但要使用它,您需要在 c# 代码页的顶部添加此 using

using System.ComponentModel.DataAnnotations;

唯一的缺点是 EmailAdressAttribute 不是那么宽松,所以它取决于你想要限制和允许的内容

如果您需要,这里是有关此类的 msdn 文档的链接: https://msdn.microsoft.com/fr-fr/library/system.componentmodel.dataannotations.emailaddressattribute(v=vs.110).aspx

【讨论】:

我将如何在 Windows 窗体项目中实现这一点? 看看 S.Petrosov 的回答,他实现了它【参考方案2】:

不,它不稳定。由于其自身的任何正则表达式都代表一个有限状态机,因此在特殊情况下,它可能会进入一个无限循环,从而嫁接服务器的 DDOS 攻击。 只需使用 MailAddress 类进行验证。

更新 1 经过测试MailAddress类和new EmailAddressAttribute().IsValid("MAIL_TEXT_HERE") 我得出的结论是,EmailAddressAttribute 的验证效果更好。 您可以通过这种方式实现它,假设您有 TextBox 和 Button 用于提交。只需将此 Click 事件处理程序添加到按钮 Click 事件:

private void button1_Click(object sender, EventArgs e)

    if(!new EmailAddressAttribute().IsValid(textBox1.Text))
    
        MessageBox.Show("Email is not valid");
    
    else
    
        MessageBox.Show("Email is valid");
    

【讨论】:

干杯,要编写验证函数,我应该使用 mailAddress 类还是将所有可能性存储在集合中? @whatdoyouNeedFromMe 只需使用 MailAddress 类 不要忘记你需要添加的使用,就像我在回答中所说的那样 @Louis-RochTessier 是的,当然,只是VS2017提供自动添加,所以我写的时候没有注意这个 如果您的答案仅涉及稳定性和真正实现有限状态机的特定正则表达式引擎,那么也许您是正确的。如果同时您还解决了便利性、一致性、先前证明的方法等问题,那么您的答案也可能是最好的(即无需重新发明***和寻找“完美”模式......本身是有争议的)。但是,.Net 正则表达式实现并不是严格意义上的 FSM。也可以产生一个多模式解决方案,可能包含在一个超时块​​中,可以被认为是“稳定的”。

以上是关于相对于 mailAddress 类,Regex 是不是稳定用于电子邮件验证?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 MailAddress 认为 'john@gmail.'是有效的电子邮件地址吗?

C: GNU regex library (regex.h)正则表达式调用示例

为啥 EmailAddressAttribute.IsValid 和 MailAddress 认为包含“ª”的电子邮件是有效的? [复制]

聚合类相对于常规类的优势[重复]

检查电子邮件地址是不是对 System.Net.Mail.MailAddress 有效

MailAddress 构造函数中的多个地址