C#中电子邮件验证的最佳正则表达式

时间:2013-04-23 11:17:56

标签: c# regex email-validation

我已经看到了许多用于不同编程语言的正则表达式,它们都旨在验证电子邮件地址。我看过很多评论说有问题的表达对某些情况不起作用,而且它们要么太严格要么太宽容。我正在寻找的是一个正则表达式,我可以在我的C#代码中使用它是明确的。

我发现的最好的事情就是这个

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

还有更好的东西吗?

6 个答案:

答案 0 :(得分:134)

  

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

[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);

答案 1 :(得分:19)

第一个选项(由于抛出捕获而导致错误,但MS会为您工作):

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

第二个选项为I Knew How To Validate An Email Address Until I Read The RFCRFC specification

答案 2 :(得分:12)

此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);
}

答案 3 :(得分:0)

电子邮件验证正则表达式

<强> ^ [A-Z0-9] [ - 一个-Z0-9 ._] + @([ - 一个-Z0-9] +)+ [AZ] {2,5-} $

或者

<强> ^ [A-Z0-9] [ - 一个-Z0-9 ._] + @([ - 一个-Z0-9] [。] +)+ [AZ] {2,5-} $

演示链接:

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

答案 4 :(得分:0)

更新了2019年的答案。

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

DECLARE @parameters nvarchar(2048) = 'variable1: value1; variable2: value2; variable3: value3'

DECLARE @var1 nvarchar(32) 
DECLARE @var2 nvarchar(32) 
DECLARE @var3 nvarchar(32) 

-- Something here to split @parameters    

SELECT @var1, @var2, @var3

正则表达式的替代配置:

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);
}

我发现编译仅在大字符串匹配时才更快,例如书籍解析。只需让正则表达式进行解释,简单的电子邮件匹配就会更快。

Thread Safety And Regex
Regex Best Practices

答案 5 :(得分:0)

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

记住EmailAddressAttributeSystem.ComponentModel.DataAnnotations namespace的一部分。