正则表达式匹配电子邮件地址和常见的混淆

时间:2011-08-23 17:24:29

标签: regex

我想知道是否有人有一个很好的正则表达式来匹配电子邮件地址,以及混淆它们的常用方法,例如“joe [at] foo [dot] com”。我不是在寻找完全符合RFC的超级正则表达式。例如,以下内容足够好:

^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$

我只需要调整它以便最常见的方式来混淆电子邮件地址。是的,我知道有些人会超越它,并找到一种方法来混淆他们的电子邮件地址,使正则表达式不匹配,但我并不担心这些情况。

编辑:请阅读整个问题。我不是在询问验证电子邮件地址的问题。我知道网上有成千上万的帖子。我特意设法检测混淆的电子邮件地址。

5 个答案:

答案 0 :(得分:4)

如何做到这一点:

 ^[A-Z0-9\._%+-]+(@|\s*\[\s*at\s*\]\s*)[A-Z0-9\.-]+(\.|\s*\[\s*dot\s*\]\s*)[a-z]{2,6}$

以下是工作中的一个示例:http://regexr.com?2uh92

简而言之,它基本上使用括号在@.分隔符上创建选项组。您可以轻松插入(\[|\()而不是括号,以使它们可选地使用括号,这类似于hi_there (at) gmail (dot) com之类的内容。

答案 1 :(得分:1)

我从@Nightfirecat获取原始脚本并对其进行了一些改进,因为它无法匹配ie。这些电子邮件:

user @ domain.com

联系{@}监护人[dot] co [dot] uk

你好[[[@]]] jazzit(点)hr

以下是正则表达式的改进版本:

[A-Z0-9\._%+-]+(\s*@\s*|\s*[\[|\{|\(]+\s*(at|@)\s*[\)|\}\]]+\s*)([A-Z0-9\.-]+(\.|\s*[\[|\{|\(]+\s*(dot|\.)\s*[\)|\}|\]]+\s*))+[a-z]{2,6}

Demo(或here - 非闪光灯)

答案 2 :(得分:1)

这是基于Nightfirecat的答案。以下正则表达式将匹配电子邮件地址和常见模糊处理 in text

[A-Z0-9\._%+-]+(?:\s*@\s*|\s*\[*\s*at\s*\]*\s*)+[A-Z0-9\.-]+(?:\s*\.\s*|\s*\[*\s*dot\s*\]*\s*)[a-z]{2,6}

当以下任何内容出现在文本字符串中时,这将找到匹配项:

obfuscated_emails = [
  "moo@doo.com",
  "m_oo@doo.co.uk",
  "moo @@ doo.com",
  "moo @ doo . com",
  "moo @ doo.com",
  "moo@doo . com",
  "moo@doo . co . uk",
  "moo@doo. co. uk",
  "m_oo @ doo.com",
  "moo [at] doo.com",
  "moo [at] doo . com",
  "moo [at] doo [dot] com",
  "m_oo [at] doo [dot] co [dot] uk",
  "moo at doo.com",
  "moo at doo . co . uk",
  "m_oo at doo . com",
  "moo at doo dot com"
]

如果您不需要或想要匹配文本中模糊的电子邮件地址,只需替换" ^"在开始时" $"最后(或在Rails中使用\ A和\ z)。

我正在使用它来确保用户不会将电子邮件地址放在不属于的文本中(或者在他们这样做时发出警告)。他们被提示在别处输入。

答案 3 :(得分:-2)

作为this answer explains,根据RFC 5322规范检测有效邮件地址的正确模式是:

#!/usr/bin/env perl
use v5.10;

$rfc5322 = qr{

   (?(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)

}x;

粘滞位

请注意,根据RFC 5322规范,(?&comment)生产是完全递归的。如果您使用的玩具正则表达式引擎无法处理模式中的递归,那么您将无法编写符合规范的RFC 5322邮件地址正确匹配的正则表达式。

答案 4 :(得分:-3)

正确答案是:您不应该检测到模糊的电子邮件地址

它们被混淆了一个原因:防止自动脚本收集它们;通过以自动方式检测和解析它们,您将违背其所有者的意愿。