46

我见过大量用于不同编程语言的正则表达式,它们都声称可以验证电子邮件地址。我看到很多评论说有问题的表达方式不适用于某些情况,它们要么太严格,要么太宽松。我正在寻找的是一个正则表达式,我可以在我的 C# 代码中使用它是确定的。

我发现的最好的东西是这个

^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$

有更好的吗?

4

6 回答 6

163

电子邮件地址:RFC 2822 格式
匹配普通电子邮件地址。不检查顶级域。
需要打开“不区分大小写”选项。

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

用法 :

bool isEmail = Regex.IsMatch(emailString, @"\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z", RegexOptions.IgnoreCase);
于 2013-04-23T11:23:22.640 回答
23

第一个选项(因为投掷而不好,但 MS 会为你工作):

bool IsValidEmail(string email)
{
    try {
        var mail = new System.Net.Mail.MailAddress(email);
        return true;
    }
    catch {
        return false;
    }
}

第二个选项是阅读我知道如何验证电子邮件地址,直到我阅读 RFCRFC 规范

于 2013-04-23T11:24:02.240 回答
14

此 C# 函数使用正则表达式来评估传递的电子邮件地址在语法上是否有效。

public static bool isValidEmail(string inputEmail)
{
   string strRegex = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
         @"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" + 
         @".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";
   Regex re = new Regex(strRegex);
   if (re.IsMatch(inputEmail))
    return (true);
   else
    return (false);
}
于 2013-04-23T11:24:01.037 回答
3

更新了 2019 年的答案。

Regex 对象对于 Matching 函数是线程安全的。知道这一点并且存在一些性能选项或文化/语言问题,我提出了这个简单的解决方案。

public static Regex _regex = new Regex(
    @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$",
    RegexOptions.CultureInvariant | RegexOptions.Singleline);

public static bool IsValidEmailFormat(string emailInput)
{
    return _regex.IsMatch(emailInput);
}

正则表达式的替代配置:

public static Regex _regex = new Regex(
    @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$",
    RegexOptions.CultureInvariant | RegexOptions.Compiled);

我发现编译只在大字符串匹配时更快,例如书籍解析。简单的电子邮件匹配会更快,只需让 Regex 进行解释即可。

线程安全和正则表达式
Regex 最佳实践

于 2019-01-24T13:45:01.710 回答
1

我想建议new EmailAddressAttribute().IsValid(emailTxt)在使用 RegEx 验证之前/之后进行额外验证

记住EmailAddressAttributeSystem.ComponentModel.DataAnnotations namespace.

于 2019-08-14T04:19:12.450 回答
0

电子邮件验证正则表达式

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

或者

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

演示链接:

https://regex101.com/r/kN4nJ0/53

于 2018-04-04T06:27:28.030 回答