【发布时间】:2011-07-29 08:01:01
【问题描述】:
我需要验证可以是单个或多个逗号分隔的电子邮件地址。
在我在正则表达式验证器中使用如下表达式之前:
string exp = @"((\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)*([,])*)*";
它正在验证多个或一个电子邮件地址。
但是相同的表达式在 C# 中没有验证?它对无效地址也表示有效。
请纠正我或建议我验证电子邮件地址的表达式。
【问题讨论】:
我需要验证可以是单个或多个逗号分隔的电子邮件地址。
在我在正则表达式验证器中使用如下表达式之前:
string exp = @"((\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)*([,])*)*";
它正在验证多个或一个电子邮件地址。
但是相同的表达式在 C# 中没有验证?它对无效地址也表示有效。
请纠正我或建议我验证电子邮件地址的表达式。
【问题讨论】:
请提供更多细节。哪些地址被匹配为有效,但应该是无效的?您如何调用正则表达式(您的 c# 代码)?
我看到的一点是您缺少锚点。
^((\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)*([,])*)*$
^ 匹配字符串的开头
$ 匹配字符串的结尾
如果您不使用它们,您的模式将在找到有效的子字符串后立即匹配。
【讨论】:
我不知道 C# 我可以给出一个想法
由',' 分割并验证每个分隔符.....很简单
【讨论】:
在不知道如何进行验证的情况下,很难说出 C# 验证验证器拒绝的某些字符串的原因。很可能是因为验证器正在查看整个字符串,而您在 C# 中使用 Regex.IsMatch(),如果 substring 匹配,它也会接受匹配。要解决这个问题,请将\A 添加到正则表达式的开头,并将\Z 添加到正则表达式的末尾。在您的情况下,整个正则表达式是可选的(由 (...)* 括起来)所以它也匹配空字符串 - 您要允许吗?
再一次,您可能想完全重新考虑正则表达式方法 - 没有理智的正则表达式可以正确验证电子邮件地址(并且您仍然会传递 看起来 有效但没有与他们关联的实际帐户)。
【讨论】:
试试这个~
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
}
【讨论】:
试试这个,
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;
}
【讨论】:
使用以下正则表达式,它将解决您的问题。以下正则表达式也将使用逗号来处理 post 和 pre 空格
/^((([a-zA-Z0-9_-.]+)@([a-zA-Z0-9_-.]+).([a-zA-Z\s?]{2 ,5}){1,25})(\s?,\s*?))$/
【讨论】: