Regex 有人能给我详细解释一下这个正则表达式吗?
我这里有一个正则表达式,我需要知道它是否会100%省略任何不好的电子邮件地址,但我不完全理解它们,所以需要拜访社区专家 字符串如下所示:Regex 有人能给我详细解释一下这个正则表达式吗?,regex,perl,Regex,Perl,我这里有一个正则表达式,我需要知道它是否会100%省略任何不好的电子邮件地址,但我不完全理解它们,所以需要拜访社区专家 字符串如下所示: ^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(.[a-zA-Z0-9-]+)*(.[a-zA-Z]{2,3})$ 提前谢谢你 ^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(.[a-zA-Z0-9-]+)*(.[a-zA-Z]{2,3})$ 一件一件地
^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(.[a-zA-Z0-9-]+)*(.[a-zA-Z]{2,3})$
提前谢谢你
^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(.[a-zA-Z0-9-]+)*(.[a-zA-Z]{2,3})$
一件一件地
^ Start of the string
[_a-zA-Z0-9-]+ One or more characters of "_" (no quotes), a letter (a-z, A-Z), a number (0-9), or "-" (no quotes)
(.[_a-zA-Z0-9-]+)* zero or more substrings of type .something, or .123, or .a123. The substring must be formed by a . and a letter (same group of letters as before). So "." is not valid. ".a" or ".1" or ".-" is.
(到目前为止,它将接受例如my.name12
或my.name12.name34
)
所以我们有一个电子邮件地址,在那里你不能有什么东西。@somethingelse.ss
(在@
前面没有“悬挂”的点)或。something@somethingelse.ss
(无起始点)。域必须以字母开头,并且不能在第一级域(.com
/.uk
/??)前面有点,因此没有something@x..com
。第一级域必须有2或3个字母(无数字)
出现错误,
(点)必须转义,因此它应该是\。
。根据语言的不同,\
必须以字符串形式转义(因此可以是\.
)如果我看得正确,根据您的正则表达式,以下内容将有效:a@a@a@a@aa
点是任何字符的符号
此外,以下有效的电子邮件地址将不被接受,尽管它应该被接受:
Someone%special@domain.de
简单的回答:不会的
其次,一个坏的电子邮件地址并不一定意味着它的格式错误(这个电子邮件地址并不意味着它的格式错误)_exist@someprovider.com格式正确但仍然不正确),正则表达式也会接受一些不正确的地址
例如,最右边的部分(([a-zA-Z]{2,3})$
)说明验证的字符串应该以点结尾,然后是两个或三个字母。这将接受不存在的顶级域名(如aa),并阻止四个字母的TLD(如info)- 此正则表达式将接受以下划线开头的电子邮件地址。这(大部分)是不可接受的
- 您尚未对“用户名”(即“@”符号下面的部分)的大小设置任何最小限制。因此,单字符用户名将绕过这一点。结合前面的异常情况,@something.com类型的电子邮件ID可能无法被检测到
- 这个。(点)运算符接受任何字符。因此,在“@”部分之后,可能无法检测到@@com等类型的(无效)域
- 只接受只有2或3个字符的域,其余的被忽略
如果你想知道EmailAddress规范,只需看看维基百科:不,它不会排除100%的坏电子邮件地址。除了拒绝所有地址之外,regex不可能做到这一点,因为绝大多数语法上有效的地址都用于不存在的帐户,例如
shgercnhlch@stackoverflow.com
真正验证电子邮件地址合法性的唯一方法是尝试向其发送邮件,即使这样,也只能告诉您该地址接受邮件,而不是由人接收(而不是由脚本发送或默默丢弃),并且即使是由人接收,你不能保证是那个声称拥有它的人。(“你坚持我必须给你一个可交付的电子邮件地址?好的。我的电子邮件地址是
president@whitehouse.gov
)请,请不要尝试使用正则表达式验证电子邮件地址;这是一个不需要重新发明的轮子,除非您编写一个可怕的毛茸茸的正则表达式,否则您将通过无效的电子邮件地址或拒绝有效的电子邮件地址
CPAN上有很多模块,它们将为您解决所有问题,并经过尝试和测试
简单的例子:
use Email::Valid;
print (Email::Valid->address('someone@example.com') ? 'yes' : 'no');
简单得多,只会起作用
或者,使用:
有关正则表达式要成功处理所有符合RFC822的地址必须有多复杂的示例,请参阅
那些试图手动验证自己电子邮件地址的人,最终往往会得到一些代码,这些代码会让语法上无效的地址溜走,甚至更糟糕的是,拒绝完全有效的地址
例如,有些人在他们的地址中使用+
,比如bob+amazon@example.com
-这称为“地址标签”或“子地址”。许多天真的验证尝试都会拒绝这一点,客户最终会去其他地方
此外,在过去,一些人习惯于假设TLD总是2或3个字符;例如,.info
启动时,在这些域中有地址的人会被告知他们的完全有效的电子邮件地址是不可接受的
最后,还有一些病态案例,如
“米老鼠”@example.com
,鲍勃[1.2.3.4]
,它们在语法上是有效的,但大多数人的手卷验证会拒绝。对于上面所有确定
接受任何字符的作者,我发现,在写对另一个正则表达式问题的回答时,这个编辑捕获小部件包含反斜杠
(这是个问题!)
好的。。。让我们把它写对:
^\s*([_a-zA-Z0-9]+(\\.[_a-zA-Z0-9\\-\\%]+)\*)@([a-zA-Z0-9]+(\\.[a-zA-Z0-9\\-]+)\*(\\.[a-zA-Z]{2,4}))\s*$
这还将%
字符合并为允许的内部值。这个例程的问题是,虽然它实际上在解析电子邮件地址方面做得很好,但效率也不是很高,因为RegEx是“贪婪”的,终止条件(应该与.com
和.edu
等匹配)将过冲,然后需要
use Email::Valid;
print (Email::Valid->address('someone@example.com') ? 'yes' : 'no');
if (Mail::RFC822::Address::valid('someone@example.com')) { ...}
^\s*([_a-zA-Z0-9]+(\\.[_a-zA-Z0-9\\-\\%]+)\*)@([a-zA-Z0-9]+(\\.[a-zA-Z0-9\\-]+)\*(\\.[a-zA-Z]{2,4}))\s*$
^[_A-Za-z0-9-\+]+(\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$