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

时间:2012-03-21 17:02:10

标签: c# regex validation email rfc

我有一个正则表达式验证我的邮件地址:

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

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

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

10 个答案:

答案 0 :(得分:50)

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

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

(([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评论中的状态,如果在正确的电子邮件地址列表之前或之后有其他文本,则验证不会失败。所以它可以作为“电子邮件搜索者”。要使其作为验证程序,您需要在正则表达式的开头添加^,并在结尾处添加$。这将确保表达式匹配所有文本。所以完整的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*而不是简单^表达式已经在最后容忍空白。

答案 1 :(得分:3)

旧帖子 - 需要相同的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})+)*$

取自this post但是,接受的答案也不起作用,但是在帖子的链接上的正则表达式确实如此。

abc@abc.com - 验证

abc@abc.com;123@qwer.com - 验证

abc@abc.com; - 未验证

empty string - 验证

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

请试试这个

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

答案 4 :(得分:1)

域名实际上更复杂。例如,大多数TLD现在使用Unicode domain names,这在欧洲很常见。考虑电子邮件地址mailtest@пример.испытание,这实际上是完全有效的  (尽管它们总是transcribed to the old form - mailtest@xn--hxajbheg2az3al.xn--jxalpdlp)。这意味着可能更容易定义哪些字符对域名有效。请参阅ICANNs

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

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

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

答案 5 :(得分:0)

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

Here is a website处理正则表达式和电子邮件地址。

我建议您将字符串拆分为;,边界,并分别检查每个电子邮件地址,使其与正则表达式有效/无效。

答案 6 :(得分:0)

我在我的日子里写过的东西。 基本电子邮件验证取自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])(;)?)+$

将电子邮件与;分隔符

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

答案 7 :(得分:0)

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

      var emailReg = new RegExp(/^([A-Z0-9.%+-]+@@[A-Z0-9.-]+.[A-Z]{2,6})*([,;][\s]*([A-Z0-9.%+-]+@@[A-Z0-9.-]+.[A-Z]{2,6}))*$/i);
  var emailText = $('#email').val();

  if (!emailReg.test(emailText)) {
      alert('Wrong Email Address\Addresses format! Please reEnter correct format');
        return false;
    }
}

答案 8 :(得分:0)

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



}

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

答案 9 :(得分:0)

这是一个非常古老的问题,但我想我会分享我的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<string> emailArray = new List<string>();

        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);


                }
            }
        }