用于验证电子邮件列表的正则表达式;每个电子邮件地址末尾的分隔符

时间:2014-11-20 14:00:57

标签: regex email-validation

我找到了这个正则表达式:

        "^(([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; 

作为有效的电子邮件列表。

感谢您的帮助。

4 个答案:

答案 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. 设计和调试正则表达式需要的时间超过线性时间。

  2. 执行长正则表达式所需的时间超过线性时间。

  3. 其他人很难理解你的尝试。如果它不是你想要的那样,它会阻止人们修改你的代码。

  4. 所以,请不要尝试使用纯正则表达式来解决这样的问题。它不是一种编程语言。

答案 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,其中这个问题实际上是重复的。