【问题标题】:Regular Expression for delimited email address分隔电子邮件地址的正则表达式
【发布时间】:2011-05-20 01:51:28
【问题描述】:

我正在寻找一个常规快递来验证电子邮件地址列表,如下所示

test1@abd.com;test.test@abc.com;test3@test.com

test1@abd.com;test.test@abc.com;test3@test.com;

可选的“;”在列表的末尾。

谢谢,

【问题讨论】:

  • 希望有一个好的答案
  • 有一个很好的答案:不要对所有事情都使用正则表达式。

标签: regex


【解决方案1】:

发件人:http://regexlib.com/RETester.aspx?regexp_id=1007

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

【讨论】:

  • 我把这个放到 Expresso 中,它抱怨它无法解析它
  • 整个表达式没有正确发布。正确的表达方式在帖子中喜欢的网站上。
  • Evan:iPad不允许你在一行的开头插入四个空格吗?我现在看到 iPad 受到反引号的挑战,但所有其他 SO 标记都可以手动输入。反引号似乎有一些解决方法:meta.stackoverflow.com/search?q=iPad
  • 我发现了这个问题 乍一看,这将允许任意数量的电子邮件地址,不带任何分隔符,后跟任意数量的分号,每个分号后跟至少一个字符。所以这将是有效的:“example@domain.comexample2@domain.com;$;8;asdf”.how to fix this.any help
  • @Evan Mulawski:那为什么要使用这个正则表达式
【解决方案2】:

“你称​​那是一把刀???” —鳄鱼邓迪

实际上,所有这些都是匹配邮件地址的非常糟糕的模式。要严格验证具有 个误报和 个误报的 RFC 5322 邮件地址,您需要以下精确模式:

  (?x)

  (?(DEFINE)

     (?<address>         (?&mailbox) | (?&group))
     (?<mailbox>         (?&name_addr) | (?&addr_spec))
     (?<name_addr>       (?&display_name)? (?&angle_addr))
     (?<angle_addr>      (?&CFWS)? < (?&addr_spec) > (?&CFWS)?)
     (?<group>           (?&display_name) : (?:(?&mailbox_list) | (?&CFWS))? ; (?&CFWS)?)
     (?<display_name>    (?&phrase))
     (?<mailbox_list>    (?&mailbox) (?: , (?&mailbox))*)

     (?<addr_spec>       (?&local_part) \@ (?&domain))
     (?<local_part>      (?&dot_atom) | (?&quoted_string))
     (?<domain>          (?&dot_atom) | (?&domain_literal))
     (?<domain_literal>  (?&CFWS)? \[ (?: (?&FWS)? (?&dcontent))* (?&FWS)?
                                   \] (?&CFWS)?)
     (?<dcontent>        (?&dtext) | (?&quoted_pair))
     (?<dtext>           (?&NO_WS_CTL) | [\x21-\x5a\x5e-\x7e])

     (?<atext>           (?&ALPHA) | (?&DIGIT) | [!#\$%&'*+-/=?^_`{|}~])
     (?<atom>            (?&CFWS)? (?&atext)+ (?&CFWS)?)
     (?<dot_atom>        (?&CFWS)? (?&dot_atom_text) (?&CFWS)?)
     (?<dot_atom_text>   (?&atext)+ (?: \. (?&atext)+)*)

     (?<text>            [\x01-\x09\x0b\x0c\x0e-\x7f])
     (?<quoted_pair>     \\ (?&text))

     (?<qtext>           (?&NO_WS_CTL) | [\x21\x23-\x5b\x5d-\x7e])
     (?<qcontent>        (?&qtext) | (?&quoted_pair))
     (?<quoted_string>   (?&CFWS)? (?&DQUOTE) (?:(?&FWS)? (?&qcontent))*
                          (?&FWS)? (?&DQUOTE) (?&CFWS)?)

     (?<word>            (?&atom) | (?&quoted_string))
     (?<phrase>          (?&word)+)

     # Folding white space
     (?<FWS>             (?: (?&WSP)* (?&CRLF))? (?&WSP)+)
     (?<ctext>           (?&NO_WS_CTL) | [\x21-\x27\x2a-\x5b\x5d-\x7e])
     (?<ccontent>        (?&ctext) | (?&quoted_pair) | (?&comment))
     (?<comment>         \( (?: (?&FWS)? (?&ccontent))* (?&FWS)? \) )
     (?<CFWS>            (?: (?&FWS)? (?&comment))*
                         (?: (?:(?&FWS)? (?&comment)) | (?&FWS)))

     # No whitespace control
     (?<NO_WS_CTL>       [\x01-\x08\x0b\x0c\x0e-\x1f\x7f])

     (?<ALPHA>           [A-Za-z])
     (?<DIGIT>           [0-9])
     (?<CRLF>            \x0d \x0a)
     (?<DQUOTE>          ")
     (?<WSP>             [\x20\x09])
   )

   (?&address)  # finally, match a mail address

我会更详细地讨论这个in this answer

这需要 Perl 兼容的正则表达式 (PCRE) 库或 Perl 本身才能正常工作。我不能保证 perl 不兼容的模式引擎会正确处理递归。

【讨论】:

  • 当然,问题是关于电子邮件地址的分隔列表...
【解决方案3】:

@Evan 的回答很接近,但表达式匹配这些无效的场景:

  1. a@test.comb@test.comc@test.com(无分隔符)
  2. a@test.com;b@test.com.c@test.com(句点 . 被接受为分隔符)
  3. a@test.com;b@test.comc@test.com(仅匹配第一个分隔符 - 问题 #1 的扩展)

为了解决这些问题(并稍微简化一下),我进行了以下更改:

  1. 删除了第三个 + 符号,以及围绕第一个电子邮件地址的外部括号 ()
  2. [;.] 更改为普通的 ; 分隔符 - 实际上我将那部分更改为 ;[ ]{0,1},因为我希望表达式匹配分号分隔符后的空格。
  3. 与 #1 类似,删除表达式中最后的 + 符号,以及分隔符(步骤 #2)和最后一个带有星号的右括号之间的外部括号 () - )*

这是最终表达式(; 分隔符后允许有一个可选空格:

/^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25}(;[ ]{0,1}([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})*$/

【讨论】:

  • 我投了赞成票,因为我发现这很有帮助,但会为我自己的使用进行调整。域中不允许使用下划线,因此这是一项调整。标准(和我的雇主)允许在本地部分使用撇号,这对许多系统来说是有效的但非常有问题,所以我也添加了这些,并且可能还需要添加对其他一些稀有字符的支持。跨度>
【解决方案4】:

我用这个:

^(([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25}(($)|( *;+ *$)|( *;+ *(?=[a-zA-Z0-9_\-\.]))))*$

https://regexr.com/3gth7

【讨论】:

  • 这实际上允许在末尾使用可选的分号,正如最初问题中所要求的那样。点赞!
【解决方案5】:

我需要允许分隔符周围存在空白,因此我使用了对 Evan Mulawski 答案的修改:

^(([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+(\s*[;.]\s*(([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+)*$

测试:http://regexlib.com/RETester.aspx?regexp_id=13126

【讨论】:

    【解决方案6】:

    这是另一个 ^(0-9a-zA-Z@([0-9a-zA-Z][-\w][0-9a-zA-Z].)+[a-zA-Z ]{2,9})$

    【讨论】:

    【解决方案7】:
    (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
    

    【讨论】:

    • 哇,这些 RE 太复杂了,你的比这里的其他的都多。这将有助于你们中的许多人描述您添加的内容以及它是如何工作的。
    • 有一个网页链接可能提供了背景,但它被模组编辑掉了。
    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    • 这个链接是这个 Reg 的来源,但是一个 mod 删除了它,让它变得更糟。我同意我可以添加一些描述,但删除信息只会让事情变得更糟。
    猜你喜欢
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    相关资源
    最近更新 更多