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

时间:2010-12-04 01:16:35

标签: regex

我正在寻找一个正则表达式来验证电子邮件地址列表,如下所示

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

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

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

感谢,

8 个答案:

答案 0 :(得分:16)

来自: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})+)*$

答案 1 :(得分:7)

“你打电话给 一把刀???”-Crocodile Dundee

实际上,所有这些都是用于匹配邮件地址的非常糟糕的模式。要严格验证带有假阴性和误报的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不兼容的模式引擎会正确处理递归。

答案 2 :(得分:2)

@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的扩展名)
  4. 为了解决这些问题(并简化一点),我进行了以下更改:

    1. 删除了第3个+符号,以及第一个电子邮件地址周围的外部()
    2. [;.]更改为普通;分隔符 - 我实际上将该部分更改为;[ ]{0,1},因为我希望表达式在分号分隔符后匹配空格。
    3. 与#1类似,删除表达式中的最后+符号,并在分隔符(步骤#2)和最后结束paren之间删除外部parens () - { {1}}
    4. 这是最终表达式(允许)*分隔符后面的可选空格:

      ;

答案 3 :(得分:1)

我需要允许分隔符周围存在空白区域,所以我使用了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

进行测试

答案 4 :(得分:1)

我用这个:

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

https://regexr.com/3gth7

答案 5 :(得分:-1)

见这里:http://www.regular-expressions.info/email.html

该页面讨论了验证一个电子邮件地址的正则表达式;您可以轻松地推广那里提出的解决方案,以匹配以分号分隔的列表。

答案 6 :(得分:-1)

电子邮件验证有很多变化。我会避开那些试图变得聪明并且列出所有tld的列表,因为它们被定期添加(例如最近的.co域名)。将正则表达式中的列表包括在内只会让您感到头疼。

我在你的字符串上尝试了这个:

\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}

我刚从regexlib.com抓起并在开始和结束时删除了^和$。

如果你通过.net Regex类运行,你应该得到一个MatchCollection,但我不确定你是否在.net中工作?

答案 7 :(得分:-1)

这是另一个 ^(0-9A-ZA-Z @([0-9A-ZA-Z] [ - \ W]。 [0-9A-ZA-Z])+ [A-ZA-Z ] {2,9})$