我想知道是否有人有一个很好的正则表达式来匹配电子邮件地址,以及混淆它们的常用方法,例如“joe [at] foo [dot] com”。我不是在寻找完全符合RFC的超级正则表达式。例如,以下内容足够好:
^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$
我只需要调整它以便最常见的方式来混淆电子邮件地址。是的,我知道有些人会超越它,并找到一种方法来混淆他们的电子邮件地址,使正则表达式不匹配,但我并不担心这些情况。
编辑:请阅读整个问题。我不是在询问验证电子邮件地址的问题。我知道网上有成千上万的帖子。我特意设法检测混淆的电子邮件地址。
答案 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}
答案 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) | (?"ed_string))
(?<domain> (?&dot_atom) | (?&domain_literal))
(?<domain_literal> (?&CFWS)? \[ (?: (?&FWS)? (?&dcontent))* (?&FWS)?
\] (?&CFWS)?)
(?<dcontent> (?&dtext) | (?"ed_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) | (?"ed_pair))
(?<quoted_string> (?&CFWS)? (?&DQUOTE) (?:(?&FWS)? (?&qcontent))*
(?&FWS)? (?&DQUOTE) (?&CFWS)?)
(?<word> (?&atom) | (?"ed_string))
(?<phrase> (?&word)+)
# Folding white space
(?<FWS> (?: (?&WSP)* (?&CRLF))? (?&WSP)+)
(?<ctext> (?&NO_WS_CTL) | [\x21-\x27\x2a-\x5b\x5d-\x7e])
(?<ccontent> (?&ctext) | (?"ed_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)
正确答案是:您不应该检测到模糊的电子邮件地址。
它们被混淆了一个原因:防止自动脚本收集它们;通过以自动方式检测和解析它们,您将违背其所有者的意愿。