用于validation多个电子邮件地址的正则表达式

我有一个正则表达式validation我的邮件地址是这样的:

([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)

这完全正常,但只允许输入一封电子邮件。 现在我想扩展它并允许添加多个邮件地址(例如,就像MS Outlook一样),并使用分号作为邮件分割器。

mail1@tld.com;mail2@tld.com;mail3@tld.com

现在我搜索并找到了这个:

([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}(;|$))

这在一点上有效,但遗憾的是在邮件末尾需要一个分号:

 mail1@tld.com; 

当用户只输入一封电子邮件时,这不是我想要的。

如何扩展我的正则表达式(第一个)以允许添加多个邮件地址,同时让它们通过分号分割?

这是您的原始表达式,已更改为允许使用分号和(可选)除分号之外的空格分隔的多封电子邮件。 它还允许单个电子邮件地址不以分号结尾。

这允许空白条目(没有电子邮件地址)。 您可以将最终*更改为+以至少需要一个地址。

 (([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)(\s*;\s*|\s*$))* 

如果你需要允许逗号,除了分号,你可以使用这个组:

 (\s*;\s*|\s*$) 

通过这个:

 (\s*(;|,)\s*|\s*$) 

重要提示:作为Martin评论中的状态,如果在正确的电子邮件地址列表之前或之后有其他文本,则validation不会失败。 所以它可以作为“电子邮件搜索者”。 要使其作为validation器工作,您需要在正则表达式的开头添加^ ,并在结尾处添加$ 。 这将确保表达式匹配所有文本。 所以完整的reex将是:

 ^(([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)(\s*;\s*|\s*$))*$ 

你可以在^之后添加一个额外的\s*来容忍列表开头的空格,就像这样。 即包括^\s*而不是简单的^表达式已经在最后容忍空白。

旧post – 需要相同的RegEx。 接受的答案对我没有用,但是,这样做了。

 ^(|([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})+)*$ 

但是,从这篇文章中检索出来,接受的答案也不起作用,但是在post的链接上的正则表达式确实如此。

abc@abc.com – validation

abc@abc.com;123@qwer.com – validation

abc@abc.com; – 不validation

empty string – validation

如果要对空字符串进行validation,请删除| 在正则表达式的开头

为什么不拆分分号,然后使用现有的正则表达式validation每个潜在的电子邮件地址? 我怀疑,编写一个巨大的正则表达式将是非常困难的维护噩梦。

请试试这个

 ^([\w+-.%]+@[\w-.]+\.[A-Za-z]{2,4};?)+$ 

域名实际上更复杂。 例如,大多数TLD现在都使用Unicode域名 ,这在欧洲很常见。 考虑电子邮件地址mailtest@пример.испытание,这实际上是完全有效的(尽管它们总是可以转录为旧表格 – mailtest@xn--hxajbheg2az3al.xn–jxalpdlp)。 这意味着可能更容易定义哪些字符对域名无效。 见ICANN 。

此外,TLD也不是您定义的集合的严格组成部分,请参阅IANA有效TLD列表 。 例如,example @ example.travel是有效的电子邮件地址。

简而言之,要validation电子邮件地址,请考虑使用已建立的第三方库,除非您正在处理有限的特殊情况。

现在,对于您的原始问题,我建议您在预处理阶段拆分合理的分隔符(’,’和’;’),修剪空格(至少在处理用户输入时)并validation每个条目。

在一本旧的正则表达式书中,他们声明你不能写一个正则表达式来匹配所有有效的电子邮件地址(尽管你可以接近)。

这是一个处理正则表达式和电子邮件地址的网站 。

我建议你将字符串拆分为; 并且,边界和单独检查每个电子邮件地址,以使您的正则表达式有效/无效。

以下是我的解决方案,它对我有用:

  var emailReg = new RegExp(/^([A-Z0-9.%+-]+@@[A-Z0-9.-]+.[AZ]{2,6})*([,;][\s]*([A-Z0-9.%+-]+@@[A-Z0-9.-]+.[AZ]{2,6}))*$/i); var emailText = $('#email').val(); if (!emailReg.test(emailText)) { alert('Wrong Email Address\Addresses format! Please reEnter correct format'); return false; } } 

我在我的日子里写过的东西。 基本的电子邮件validation来自RFC 2822的实际实现

 ^([a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])(;)?)+$ 

匹配电子邮件; 分隔器

我想要更多的分隔符交换(;)? 用[;,|]? 等等[]括号。

这是一个简单的程序,它可以在不使用正则表达式的情况下为您执行此操作。实际上它确实使用正则表达式,但我们不必担心它看起来如何.php为我们这样做。

 public function test_reg() { $email_list = ''; $array = explode(";",$email_list); foreach ($array as $value) { $value; if (!filter_var($value, FILTER_VALIDATE_EMAIL) === false) { $msg = "Email List Contains valid email addresses."; } else { $msg ="Your Email list contains an invalid email at. &nbsp&nbsp &nbsp".$value; break; } } echo $msg; } 

您必须用分号分隔您的电子邮件。

这是一个非常古老的问题,但我想我会分享我的C#代码。

我决定用分号解析然后单独检查每封电子邮件:

  string toAddress = "testemail@gmail.com;test2@testing.com;"; Regex rgx = new Regex(@"^[_a-z0-9-]+(\.[_a-z0-9-]+)*(\+[a-z0-9-]+)?@[a-z0-9-]+(\.[a-z0-9-]+)*$"); List emailArray = new List(); if(toAddress != null && toAddress != "") { if (toAddress.IndexOf(";") != -1) { emailArray = toAddress.Replace(" ","").Split(';').ToList(); } else { emailArray.Add(toAddress); } foreach (string email in emailArray) { if (rgx.IsMatch(email ?? "")) { SendEmail(email, subject, body); } } }