验证逗号分隔的电子邮件地址的正则表达式?

5

我需要验证电子邮件地址,可以是单个或多个逗号分隔的地址。

之前我在正则表达式验证器中使用了这样一个表达式:

string exp = @"((\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)*([,])*)*";

它可以验证多个或单个电子邮件地址。

但是在C#中,相同的表达式不能进行验证?它也会将有效的和无效的地址都认为是有效的。

请纠正我或建议一个验证电子邮件地址的表达式。

6个回答

19

请提供更多细节。哪些地址被匹配为有效,但实际上应该是无效的?您如何调用正则表达式(您的c#代码)?

我发现一个问题是您缺少锚点。

 ^((\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)*([,])*)*$

^ 匹配字符串的开头。

$ 匹配字符串的结尾。

如果您不使用它们,则您的模式将在找到有效子字符串时立即匹配。


谢谢这个。我在(str.match(/^((\w+([-+.']\w+)@\w+([-.]\w+).\w+([-.]\w+))([,]))$/gi) != null);中使用它。没有编辑器可以正确地对其进行语法高亮,但它是正确的。在Chrome和FF中工作。 - Kenyakorn Ketsombut

4

我不会C#,但我可以提供一个想法:按照','进行分割,验证每个分隔符...... 这很简单。


4
不知道你如何进行验证,很难确定为什么C#正在验证一些验证器拒绝的字符串。最有可能的是因为验证器正在查看整个字符串,而你在C#中使用了Regex.IsMatch(),如果子字符串匹配,它也会接受匹配。为了解决这个问题,在你的正则表达式开头添加\A,在结尾添加\Z。在你的情况下,整个正则表达式是可选的(由(...)*括起来),所以它也匹配空字符串 - 你想允许这样吗?
然而,你可能需要重新考虑正则表达式的方法 - 没有理智的正则表达式可以正确地验证电子邮件地址(你仍然会通过那些只是看起来有效但没有实际关联账户的地址)。

1

试试这个~

try {
    Regex regexObj = new Regex(@"([A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,6},?)*", RegexOptions.IgnoreCase | RegexOptions.Multiline);
    if (regexObj.IsMatch(subjectString)) {
        // Successful match
    } else {
        // Match attempt failed
    } 
} catch (ArgumentException ex) {
    // Syntax error in the regular expression
}

1
尝试一下这个:
    private bool IsValidMultipleEmail1(string value)
    {
        Regex _Regex = new Regex(@"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");

        string[] _emails = value.Split(new char[] { ',', ';', ' ' }, StringSplitOptions.RemoveEmptyEntries);

        foreach (string email in _emails)
        {
            if (!_Regex.IsMatch(email))
                return false;
        }

        return true;
    }

0
使用以下正则表达式,它将解决您的问题。以下正则表达式还将考虑逗号前后的空格。
/^((([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z\s?]{2,5}){1,25})*(\s*?,\s*?)*)*$/ 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接