Regex 正则表达式以匹配电子邮件地址和常见混淆
我想知道是否有人有一个很好的正则表达式来匹配电子邮件地址,还有一些常用的混淆方法,比如“joe[at]foo[dot]com”。我不是在寻找一个完全符合RFC的超级正则表达式。例如,以下几点已经足够好了:Regex 正则表达式以匹配电子邮件地址和常见混淆,regex,Regex,我想知道是否有人有一个很好的正则表达式来匹配电子邮件地址,还有一些常用的混淆方法,比如“joe[at]foo[dot]com”。我不是在寻找一个完全符合RFC的超级正则表达式。例如,以下几点已经足够好了: ^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$ 我只需要调整一下它,找出最常见的混淆电子邮件地址的方法。是的,我知道有些人会比它聪明,并找到一种方法来混淆他们的电子邮件地址,使其与正则表达式不匹配,但我并不担心这些情况 编辑:请阅读整个问题。我不是在问验证电
^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$
我只需要调整一下它,找出最常见的混淆电子邮件地址的方法。是的,我知道有些人会比它聪明,并找到一种方法来混淆他们的电子邮件地址,使其与正则表达式不匹配,但我并不担心这些情况
编辑:请阅读整个问题。我不是在问验证电子邮件地址的问题。我知道网上有成千上万的关于这个的帖子。我正在特别研究检测模糊电子邮件地址的方法。这样做怎么样:
^[A-Z0-9\._%+-]+(@|\s*\[\s*at\s*\]\s*)[A-Z0-9\.-]+(\.|\s*\[\s*dot\s*\]\s*)[a-z]{2,6}$
下面是一个it工作的例子:
简言之,它基本上是在@
和
除沫器上使用括号进行选项组。您可以很容易地插入(\[\\()
)而不是括号,以使它们选择性地使用括号,这将匹配类似于hiÈu there(at)gmail(dot)com
的内容,根据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;
!/usr/bin/env perl
使用v5.10;
$rfc5322=qr{
(?(定义)
(?(?&邮箱)|(?&组))
(?(?&name_addr)|(?&addr_spec))
(?(?&显示名称)?(?&角度地址))
(?(?&CFWS)?<(?&addr_spec)>(?&CFWS)?)
(?(?&显示名称):(?:(?&邮箱列表);(?&CFWS));(?&CFWS)?)
(?(?&短语))
((?(?&邮箱)(?:,(?&邮箱))*)
(?(?&局部)\@(?&域)
(?(?&dot_原子);(?"ed_字符串))
(?(?&dot_原子);(?&domain_文字))
(?(?&CFWS)?\[(?:(?&FWS)?(?&dcontent))*(?&FWS)?
\](?&CFWS)?)
(?(?&dtext)|(?"ed_对))
(((?&NO_WS_CTL)|[\x21-\x5a\x5e-\x7e])
(?(?&ALPHA)|(?&DIGIT)|[!\$%和'*+-/=?^`{124}~)
(?(?&CFWS)?(?&atext)+(?&CFWS)?)
(?(?&CFWS)?(?&dot_原子_文本)(?&CFWS)?)
(?(?&atext)+(?:\(?&atext)+)*)
(?[\x01-\x09\x0b\x0c\x0e-\x7f])
(?\\(?&文本))
(((?&NO_WS_CTL)|[\x21\x23-\x5b\x5d-\x7e])
(?(?&qtext)|(?"ed_对))
(?(?&CFWS)?(?&DQUOTE)(?:(?&FWS)?(?&qcontent))*
(?&FWS)?(?&DQUOTE)(?&CFWS)?)
(?(?&atom)|(?"ed_字符串))
(?(&word)+)
#折叠空白
(?(?:(?&WSP)*(?&CRLF))(?&WSP)+)
(((?&NO_WS_CTL)|[\x21-\x27\x2a-\x5b\x5d-\x7e])
(?(?&ctext)|(?"ed|对)|(?&comment))
(?\((?:(?&FWS)?(?&ccontent))*(?&FWS)?\)
((?:(?&FWS)?(?&comment))*
(?:(?:(?&FWS)?(?&comment))|(?&FWS)))
#无空白控制
(?[\x01-\x08\x0b\x0c\x0e-\x1f\x7f])
(?[A-Za-z])
(? [0-9])
(?\x0d\x0a)
(? ")
(?[\x20\x09])
)
(?&地址)
}x;
棘手的一点
请注意,
(?&comment)
根据RFC 5322规范,生产是完全递归的。如果您使用的玩具正则表达式引擎无法处理模式中的递归,那么您将无法编写与RFC 5322规范中的邮件地址正确匹配的正则表达式。正确答案是:您不应该检测到模糊的电子邮件地址
它们被混淆的原因是:为了防止自动脚本获取它们;通过自动检测和解析它们,你违背了它们所有者的意愿。我从@Nightfirecat获取了原始脚本,并对其进行了一些改进,因为它与ie不匹配。这些电子邮件: user@domain.com 联系英国{@}卫报[dot]co[dot]uk 你好[[@]]jazzit(dot)hr 以下是正则表达式的改进版本:
[A-Z0-9\._%+-]+(\s*@\s*|\s*[\[|\{|\(]+\s*(at|@)\s*[\)|\}\]]+\s*)([A-Z0-9\.-]+(\.|\s*[\[|\{|\(]+\s*(dot|\.)\s*[\)|\}|\]]+\s*))+[a-z]{2,6}
(或-非flash格式)这是基于Nightfirecat的答案。以下正则表达式将匹配文本中的电子邮件地址和常见混淆:
[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)
我使用此选项是为了确保用户不会将电子邮件地址放在不属于它的文本中(或在他们这样做时警告他们)。系统会提示他们在其他地方输入电子邮件地址。@Oli Charlesworth你读过我的问题吗?@Oli我使用了“混淆”一词“在我的问题中有4次,标题中也有一次。谢谢,但这不是我想要的。这与我现在使用的非常接近。我担心的是这样的正则表达式可能太贪婪了。你可以对任何空格应用非贪婪修饰符(我只是认为这样可能会更灵活一些),但除此之外,我不知道会是这样。@mellowsoon没有指定他们想要检测的内容,但有正当的理由,比如从mellowsoon控制的服务上的用户生成内容中删除电子邮件,mellowsoon控制着非常高尚的一切,但仅仅因为地球上有人愿意这样做,并不一定意味着这是正确的/公正的/合法的/可取的您的正则表达式似乎是最好的正则表达式,但它也捕捉到了一些误报,例如:“word wordwiththeend.anotherword”谢谢!修改它以匹配更多的情况
\b[a-Z0-9\.\%+-]+([\[\[\\\\{124;\([\\\\ s*](at[\\+\s\\\+]s*.*\s*)[a-Z0+-9\.-[a-]*[a-z]{2,6}\b