我用这个

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

Regexp来验证电子邮件

([\w\.\-]+) -用于第一级域名(许多字母和数字,也有点和连字符) ([\w\-]+) -用于二级域 ((\.(\w){2,3})+) -这是用于其他级别域(从3到无穷),其中包括一个点和2或3个字面量

这个正则表达式有什么问题?

编辑:它与“something@someth.ing”电子邮件不匹配


当前回答

我认为你的插入符号和美元符号是问题的一部分 你也应该修改一下正则表达式,我用的是下一个 @"[ :]+([\ w -] +) @ ((\ w -.])+((.(\ w){2,3}) +)”

其他回答

要验证您的电子邮件ID,您只需创建这样的方法并使用它。

    public static bool IsValidEmail(string email)
    {
        var r = new Regex(@"^([0-9a-zA-Z]([-\.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$");
        return !String.IsNullOrEmpty(email) && r.IsMatch(email);
    }

这将返回True / False。(有效/无效的电子邮件Id)

这可以防止其他人在评论中提到的无效邮件:

Abc.@example.com
Abc..123@example.com
name@hotmail
toms.email.@gmail.com
test@-online.com

它还可以防止带有双点的电子邮件:

hello..world@example..com

试着用尽可能多的无效电子邮件地址进行测试。

using System.Text.RegularExpressions;

public static bool IsValidEmail(string email)
{
    return Regex.IsMatch(email, @"\A[a-z0-9]+([-._][a-z0-9]+)*@([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,4}\z")
        && Regex.IsMatch(email, @"^(?=.{1,64}@.{4,64}$)(?=.{6,100}$).*");
}

请参阅在c#中使用正则表达式验证电子邮件地址。

目前对我来说,最好的方法是使用FluentValidation库。它有一个内置的电子邮件地址验证器。用法非常简单,你不必考虑正则表达式。

using FluentValidation;
public class TestClass
{
   public string Email { get; set; }
}

public class TestClassValidator: AbstractValidator<TestClass>
{
   public TestClassValidator()
   {            
      RuleFor(x => x.Email).EmailAddress().WithMessage($"nameof{(TestClass.Email)} is not a valid email address");
   }
}

我知道这个问题很久以前就被问过了,但也许用一种新的方法来刷新答案会对某人有所帮助。

这个正则表达式工作得很完美:

bool IsValidEmail(string email)
{
    return Regex.IsMatch(email, @"^[\w!#$%&'*+\-/=?\^_`{|}~]+(\.[\w!#$%&'*+\-/=?\^_`{|}~]+)*@((([\-\w]+\.)+[a-zA-Z]{2,4})|(([0-9]{1,3}\.){3}[0-9]{1,3}))\z");
}

像。museum这样的顶级域名就不是这样匹配的,还有一些其他的长顶级域名。此外,你可以使用MailAddress类验证电子邮件地址,微软在这里解释了一个说明:

与使用正则表达式验证电子邮件地址不同, 你可以使用System.Net.Mail.MailAddress类。来确定 电子邮件地址是否有效,将电子邮件地址传递给 mailaddress (String)类构造函数。

public bool IsValid(string emailaddress)
{
    try
    {
        MailAddress m = new MailAddress(emailaddress);

        return true;
    }
    catch (FormatException)
    {
        return false;
    }
}

这为您省去了很多麻烦,因为您不必编写(或试图理解他人的)正则表达式。

编辑:对于那些对尝试/捕捉过敏的人:在。net 5中,你可以使用MailAddress.TryCreate。请参见https://stackoverflow.com/a/68198658,包括如何修复的示例。,空格,缺失。tld等。