Regex,用于验证多个电子邮件地址

本文关键字:电子邮件地址 验证 用于 Regex | 更新日期: 2023-09-27 18:28:27

我得到了一个Regex,它验证我的邮件地址,如下所示:

([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})(']?)

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

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;

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

如何扩展上面的regex(第一个),允许添加多个邮件地址,同时用分号分隔它们?

Regex,用于验证多个电子邮件地址

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

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

(([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在评论中所说,如果在正确的电子邮件地址列表之前或之后有额外的文本,验证不会失败。因此,它可以作为"电子邮件搜索器"工作。要使其作为验证器工作,您需要在正则表达式的开头添加^,并在末尾添加$。这将确保表达式与所有文本匹配。因此,完整的正则表达式是:

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

然而,从这篇帖子中检索到的公认答案也不起作用,但帖子中链接上的Regex起了作用。

abc@abc.com-验证

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

abc@abc.com;-不验证

empty string-验证

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

请尝试此

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

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

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

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

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

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

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

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

我建议您在;,边界处拆分字符串,并使用正则表达式分别检查每个电子邮件地址是否有效。

我这几天写的东西。基本的电子邮件验证来自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])(;)?)+$

将电子邮件与匹配;分离器

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

以下是我的解决方案,它对我来说如预期:

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

这里有一个简单的程序,它可以在不使用正则表达式的情况下为您实现这一点。实际上,它确实使用了正则表达式,但我们不必担心它的外观。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<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);
        }
    }
}

^(|([a-zA-Z0-9_''-''.]+)@([a-zA-Z0-9_-''.]+

这对我来说很好。它满足逗号分隔的前/后空格。添加了双斜杠''而不是单斜杠'',因为单斜杠会出错,但无法在此处发布