多年来,我慢慢地开发了一个正则表达式,它可以正确验证大多数电子邮件地址,假设它们不使用IP地址作为服务器部分。
我在几个PHP程序中使用它,而且大多数时候都可以使用。然而,不时有人与我联系,他们对使用它的网站有问题,我最终不得不做出一些调整(最近我意识到我不允许四个字符的TLD)。
你有或见过验证电子邮件的最佳正则表达式是什么?
我见过几种使用函数的解决方案,这些函数使用了几个较短的表达式,但我宁愿在简单函数中使用一个长的复杂表达式,而不是在更复杂的函数中使用几个短表达式。
多年来,我慢慢地开发了一个正则表达式,它可以正确验证大多数电子邮件地址,假设它们不使用IP地址作为服务器部分。
我在几个PHP程序中使用它,而且大多数时候都可以使用。然而,不时有人与我联系,他们对使用它的网站有问题,我最终不得不做出一些调整(最近我意识到我不允许四个字符的TLD)。
你有或见过验证电子邮件的最佳正则表达式是什么?
我见过几种使用函数的解决方案,这些函数使用了几个较短的表达式,但我宁愿在简单函数中使用一个长的复杂表达式,而不是在更复杂的函数中使用几个短表达式。
当前回答
我要验证的电子邮件地址将由使用System.NET.Mail命名空间的ASP.NET web应用程序用于向人员列表发送电子邮件。
因此,我不使用一些非常复杂的正则表达式,而是尝试从地址创建一个MailAddress实例。如果地址格式不正确,MailAddress构造函数将引发异常。通过这种方式,我知道我至少可以把邮件拿到门外。当然,这是服务器端验证,但至少您需要这样做。
protected void emailValidator_ServerValidate(object source, ServerValidateEventArgs args)
{
try
{
var a = new MailAddress(txtEmail.Text);
}
catch (Exception ex)
{
args.IsValid = false;
emailValidator.ErrorMessage = "email: " + ex.Message;
}
}
其他回答
我已经使用OP的正则表达式的这个修改版本有一段时间了,它并没有给我留下太多惊喜。我从未在电子邮件中遇到过撇号,所以这并不能证明这一点。它确实验证了Jean+François@anydomain.museum和试@例子.测试.مثال.آسایل,但不奇怪地滥用这些非字母数字字符+@you.com上。
(?!^[.+&'_-]*@.*$)(^[_\w\d+&'-]+(\.[_\w\d+&'-]*)*@[\w\d-]+(\.[\w\d-]+)*\.(([\d]{1,3})|([\w]{2,}))$)
它确实支持IP地址you@192.168.1.1,但我还没有完善到足以处理诸如999.999.999.1之类的伪IP地址范围。
它还支持超过三个字符的所有TLDasdf@asdf.asdf我认为这是原作的表现。我被打败了,现在有太多超过3个字符的TLD。
我知道OP已经放弃了他的正则表达式,但这种味道仍然存在。
互联网上有很多这样的例子(我认为甚至有一个完全验证RFC的例子——但如果内存可用的话,它有几十/几百行)。
人们倾向于对这类事情进行验证。为什么不检查它是否有@和至少一个。并且满足一些简单的最小长度?输入一封假电子邮件并仍然匹配任何有效的正则表达式是很简单的。我猜假阳性比假阴性好。
public bool ValidateEmail(string sEmail)
{
if (sEmail == null)
{
return false;
}
int nFirstAT = sEmail.IndexOf('@');
int nLastAT = sEmail.LastIndexOf('@');
if ((nFirstAT > 0) && (nLastAT == nFirstAT) && (nFirstAT < (sEmail.Length - 1)))
{
return (Regex.IsMatch(sEmail, @"^[a-z|0-9|A-Z]*([_][a-z|0-9|A-Z]+)*([.][a-z|0-9|A-Z]+)*([.][a-z|0-9|A-Z]+)*(([_][a-z|0-9|A-Z]+)*)?@[a-z][a-z|0-9|A-Z]*\.([a-z][a-z|0-9|A-Z]*(\.[a-z][a-z|0-9|A-Z]*)?)$"));
}
else
{
return false;
}
}
根据我的理解,它很可能会被。。。
/^([a-z0-9_-]+)(@[a-z0-9-]+)(\.[a-z]+|\.[a-z]+\.[a-z]+)?$/is
我从不麻烦用自己的正则表达式创建,因为很可能其他人已经提出了更好的版本。我总是使用regexlib来找到一个我喜欢的。