任何人都可以向我详细解释这个正则表达式吗?

时间:2011-02-23 11:29:38

标签: regex perl

我在这里有一个RegEx,我需要知道它是否会100%省略任何不良的电子邮件地址,但我完全不理解它们,所以需要请求社区专家。

字符串如下:

^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(.[a-zA-Z0-9-]+)*(.[a-zA-Z]{2,3})$

提前谢谢!

9 个答案:

答案 0 :(得分:16)

请不要尝试使用正则表达式验证电子邮件地址;这是一个不需要重新发明的轮子,除非你写出一个可怕的正常表达式,否则你将通过无效的电子邮件地址或拒绝有效的电子邮件地址。

CPAN上有很多模块,例如Email::Valid,它们将为您完成所有这些并经过测试和验证。

简单示例:

use Email::Valid;
print (Email::Valid->address('someone@example.com') ? 'yes' : 'no');

更简单,并且会起作用。

或者,使用Mail::RFC822::Address

if (Mail::RFC822::Address::valid('someone@example.com')) { ...}

有关正则表达式如何成功处理所有符合RFC822的地址的示例,请查看this beauty

尝试手动滚动自己的电子邮件地址验证的人往往会得到一些代码,这些代码可以让语法无效的地址漏掉,更糟糕的是,拒绝完全有效的地址。

例如,有些人在其地址中使用+,例如bob+amazon@example.com - 这被称为“地址标记”或“子地址”。在验证方面有很多天真的尝试会拒绝这一点,而客户最终会去其他地方。

此外,过去有些人曾经认为TLD总是2或3个字符;例如, .info已启动,在这些域中拥有地址的人会被告知他们完全有效的电子邮件地址是不可接受的。

最后,有一些病态案例,例如"Mickey Mouse"@example.combob@[1.2.3.4]在语法上有效,但大多数人的手动验证会拒绝。

答案 1 :(得分:8)

^[_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.name12my.name12.surname34

    @ a "@" (like max@something)

    [a-zA-Z0-9-]+ One or more characters with the same pattern as before
    (.[a-zA-Z0-9-]+)* Zero or more substrings of type ".something"... just as before
    (.[a-zA-Z]{2,3}) A "." (dot) and 2 or 3 letters (a-z or A-Z)

    $ The end of the string

所以我们有一个电子邮件地址,你不能something.@somethingelse.ss@之前没有“悬空”点)或.something@somethingelse.ss(没有开始点)。域必须以字母开头,并且在第一级域(.com / .uk / ??)之前不能有点,所以没有something@x..com。第一级域必须有2或3个字母(无数字)

出现错误,.(点)必须转义,因此应为\.。根据语言的不同,\必须以字符串形式进行转义(因此可以\\.

答案 2 :(得分:6)

如果我看到正确,根据您的正则表达式,以下内容有效:a@a@a@a@aa
点是任何角色的标志!
此外,以下有效电子邮件地址不会被接受,但它应该: Someone%special@domain.de

答案 3 :(得分:4)

简单回答:它不会。

除了错误的电子邮件地址并不一定意味着它的格式错误(this_email_address_does_not_exist@someprovider.com格式正确但仍然不好)之后,RegEx也会接受一些错误的地址

例如,最右边的部分((.[a-zA-Z]{2,3})$)表明经过验证的字符串应以点结尾,然后是两个或三个字母。这将接受不存在的顶级域名(例如 .aa ),并将阻止四个字母的顶级域名(例如 .info

答案 4 :(得分:2)

  • 此RegEx将接受以下划线开头的电子邮件地址。这(大多数情况下)是不可接受的。
  • 您尚未对“用户名”(即“@”符号下方的部分)的大小设置任何最低限制。因此,单个字符的用户名将绕过此。结合之前的例外情况,_@something.com类型的电子邮件ID可能无法检测到。
  • 。 (点)运算符接受任何字符。因此,在“@”部分之后,可能无法检测到类型为@@ .com等的(无效)域。
  • 只接受2或3个字符的域名,其余部分将被忽略。

答案 5 :(得分:2)

[_a-zA-Z0-9-]

意味着您只需要在您的电子邮件地址中使用这些字符(任何字母数字字符或' - '或'_'),但它对所有这些字符都有效: #$%& '* + - / =? ^ _` {| }〜

第一部分(在@之前)最多必须是253个字符({1,253}),第二部分(在@之后)最长可以是64个字符({4,64})。 (在放入({4,64})计数限制之前,将括号添加到第一组或第二组)

如果您想了解EmailAddress规范,请查看维基百科:The Article On Wiki

答案 6 :(得分:2)

不,它不会排除100%的错误电子邮件地址。如果没有拒绝所有地址,那么正则表达式就不可能完成,因为绝大多数语法上有效的地址都是针对不存在的帐户,例如shgercnhlch@stackoverflow.com

真正验证电子邮件地址合法性的唯一方法是尝试向其发送邮件 - 甚至只会告诉您邮件在该地址被接受,而不是由人接收(相反)被喂养到一个剧本或被悄悄地丢弃了),即使它被一个人接收,你也无法保证是声称拥有它的人。 (“你坚持我必须给你一个可交付的电子邮件地址?很好。我的电子邮件地址是president@whitehouse.gov。”)

答案 7 :(得分:0)

或许这个正则表达式可以吗?

^[_A-Za-z0-9-\+]+(\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$

取自
http://www.mkyong.com/regular-expressions/how-to-validate-email-address-with-regular-expression/

答案 8 :(得分:-2)

对于识别.接受任何字符的上述所有作者,我发现在编写对另一个RegEx问题的响应时,此编辑捕获小部件会使用反斜杠。

(这是一个问题!)

好的......让我们正确地写一下:

^\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)将超调,然后需要回溯,耗费大量的CPU时间。

真正的答案是使用特定于此的例程,正如其他海报所推荐的那样。但是如果你没有CPAN模块,或者目标环境没有,那么RegEx hack可以接受。