用于分隔电子邮件地址的正则表达式

Eat*_*oku 14 regex

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

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

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

可选的 ";" 在列表的末尾.

谢谢,

Eva*_*ski 17

来自: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})+)*$
Run Code Online (Sandbox Code Playgroud)

  • 我发现这个问题乍一看,这将允许任意数量的电子邮件地址,没有任何分隔符,后跟任意数量的分号,每个分号后跟至少一个字符.所以这将是有效的:"示例@ domain.comexample2 @ domain.com; $; 8; asdf"..如何解决此问题.任何帮助 (2认同)

tch*_*ist 7

"你叫一刀---" -Crocodile邓迪

实际上,所有这些都是用于匹配邮件地址的非常差的模式.要 严格验证具有误报和误报的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
Run Code Online (Sandbox Code Playgroud)

在这个答案中更详细地讨论了这一点.

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


Blu*_*her 5

@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. 删除了第 3 个+符号,以及()围绕第一个电子邮件地址的外部括号。
  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})*$/
Run Code Online (Sandbox Code Playgroud)

  • 我已经投票,因为我发现这很有帮助,但会根据我自己的使用进行调整。域中不允许使用下划线,因此这是一项调整。标准(和我的雇主)允许在本地部分使用撇号,这是有效的,但对于许多系统来说非常有问题,所以我也添加了这些,并且可能还需要添加对其他一些罕见字符的支持。 (2认同)