【问题标题】:Regex for validating multiple E-Mail-Addresses用于验证多个电子邮件地址的正则表达式
【发布时间】:2012-03-21 17:02:10
【问题描述】:

我有一个正则表达式来验证我的邮件地址,如下所示:

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

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

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

【问题讨论】:

标签: c# regex validation email rfc


【解决方案1】:

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

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

(([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* 以允许列表开头出现空白,如下所示。 IE。包括^\s* 而不是简单的^ 该表达式已经允许在末尾有空格。

【讨论】:

  • 嗯,这看起来很有希望,但要求用户始终在邮件地址后添加分号,即使只指定了一个
  • 不,它根本不需要分号!最后一组 (\s*;\s*|\s*$),接受两种可能性:1) \s*;\s*,whis 是分号,其前后有可选空格,2) \s* $ 是行尾,前面有可选空格。如果它不是结尾,这需要分号(因为有多个地址),但如果它是结尾则不允许分号。我已经测试过了。如果它对您不起作用,请确保在表达式的开头和结尾修剪空格。它也可能与正则表达式选项有关。如果我能提供进一步的帮助,请告诉我。
  • 这里是一个稍微修改过的版本,它将提供一个匹配完整匹配的单个捕获组。它也是锚定的,因此整个输入必须与模式匹配,这很有帮助,因为您正在验证输入。 ^((?:(?:[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*$))*)$
  • 我尝试在 mvc5 中的正则表达式验证中使用它,它似乎因某种原因而损坏。有人也尝试过吗?
  • 到底是什么失败了?像“。*”这样的虚拟正则表达式对你有用吗?如果是这样,哪种情况对您不利?这个正则表达式在 C# 和 JavaScript 中都可以工作(在 regexplanet.com 上测试过),所以没有理由让它在 MVC 中失败。
【解决方案2】:

旧帖子 - 需要相同的正则表达式。接受的答案对我不起作用,但是,确实如此。

^(|([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 - 验证

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

【讨论】:

    【解决方案3】:

    请试试这个

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

    【讨论】:

    • 这将允许 2 封电子邮件,它们之间没有 ;
    【解决方案4】:

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

    【讨论】:

    • 不可能编写 C# 代码来拆分字符串,正则表达式总是会检查整个字符串。是否有正则表达式拆分方式?
    • @SeToY,C# 是图灵完备的,所以编写分割字符串的代码应该是完全可能的,事实上 String.Split 正是这样做的。
    • @Alexei Levenkov 这不是重点,我知道如何用 C# 拆分字符串,但我不能这样做:)
    • @SeToY 请理解“不可能”和“不允许”有完全不同的含义——混淆它们是在浪费很多人的时间
    • @SeToY,如果您有特殊限制 - 您应该在问题中说明它们。此外,如果它是某种家庭作业 - 请确保添加“家庭作业”标签,以便人们更好地了解哪种类型的答案最有效。
    【解决方案5】:

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

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

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

    【讨论】:

      【解决方案6】:

      域名实际上要复杂得多。例如,现在大多数 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 是一个有效的电子邮件地址。

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

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

      【讨论】:

        【解决方案7】:

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

        匹配带有 ; 的电子邮件分隔符

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

        【讨论】:

          【解决方案8】:

          以下是我的解决方案,它按预期工作:

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

          【讨论】:

          • 问题是关于实际的正则表达式而不是 JavaScript 实现。您可以通过强调您使用的正则表达式来改进您的答案。
          【解决方案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;
          
          
          
          }
          

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

          【讨论】:

            【解决方案10】:

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

            【讨论】:

              猜你喜欢
              • 2017-01-12
              • 2016-10-09
              • 1970-01-01
              • 1970-01-01
              • 2023-04-05
              • 2011-10-12
              • 2016-11-15
              • 2011-02-14
              相关资源
              最近更新 更多