我找到了这个正则表达式:
"^(([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5}){1,25})+([;.](([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5}){1,25})+)*$"
验证电子邮件列表,例如:address1@gmail.com; adresse2@gmail.com
但是我需要调整它来验证这个结构:
address1@gmail.com;adresse2@gmail.com;
并且只有一个具有此结构的电子邮件地址:
address1@gmail.com;
我还希望能够验证包含+号,
的电子邮件地址例如验证:
address1@gmail;adress2@gmail.com;addres+3@gmail.com;
作为有效的电子邮件列表。
感谢您的帮助。
答案 0 :(得分:1)
不要滥用正则表达式。
花费大量时间和精力写一些效率低下且难以分析的东西是不值得的。
如果你知道分号是分号,我会提供以下伪代码:
A<-split email-list with ';'
valid<-True
foreach email in A
if email != "" and email doesn't match [\w\-\.+]+@([\w+\-]+\.)+[a-zA-Z]{2,5}
valid<-False
end
end
return valid
正则表达式[\w\-\.+]+@([\w+\-]+\.)+[a-zA-Z]{2,5}
验证一个电子邮件地址。这是perl兼容的语法。
它匹配域中的a-zA-Z _-。+,并允许其中包含a-zA-Z-的域名,并以2到5个a-zA-Z组合结束。
在您提供的正则表达式中,它将域名与([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5}){1,25})+
匹配,这很奇怪。我不认为你应该这样做。
关于我说你滥用正则表达式的原因是,即使你要解决的问题可以在正则表达式中解决,但是
设计和调试正则表达式需要的时间超过线性时间。
执行长正则表达式所需的时间超过线性时间。
其他人很难理解你的尝试。如果它不是你想要的那样,它会阻止人们修改你的代码。
所以,请不要尝试使用纯正则表达式来解决这样的问题。它不是一种编程语言。
答案 1 :(得分:1)
此正则表达式将根据您的条件匹配电子邮件ID。
(?![\W_])((?:([\w+-]{2,})\.?){1,})(?<![\W_])@(?![\W_])(?=[\w.-]{5,})(?=.+\..+)(?1)(?<![\W_])
考虑分号分隔的电子邮件ID,最好根据分号对它们进行拆分,并分别匹配每个匹配项以避免混淆。
您可以查看matches here.
答案 2 :(得分:0)
使用分割整个字符串;字符并根据以下正则表达式匹配每个元素。它还会照顾加号
string pattern = " \b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b";
foreach(string email in emailString.Split(';')
{
if(Regex.IsMatch(email, pattern))
{
//do stuff
}
}
答案 3 :(得分:0)
正如其他人所说,首先在;
上拆分,然后单独验证地址。如果您打算使用正则表达式来验证电子邮件,请至少使用一个至少模糊测试好的和坏的示例,例如fightingforalostcause.net 上列出的this project,或在this definitive question,其中这个问题实际上是重复的。