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

Mat*_*att 0 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})$
Run Code Online (Sandbox Code Playgroud)

先感谢您!

Dav*_*ous 16

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

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

简单的例子:

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

更简单,并将工作.

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

if (Mail::RFC822::Address::valid('someone@example.com')) { ...}
Run Code Online (Sandbox Code Playgroud)

有关正则表达式如何成功处理所有符合RFC822标准的地址的示例,请看一下这种美观.

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

例如,有些人+在他们的地址中使用,例如bob+amazon@example.com- 这被称为"地址标记"或"子地址".相当多的天真尝试验证会拒绝,并且客户最终会去其他地方.

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

最后,还有一些病理情况下,如"Mickey Mouse"@example.com,bob@[1.2.3.4]这在语法上,有效的,但大多数人的手卷验证会拒绝.


xan*_*tos 8

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

一块一块

    ^  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.
Run Code Online (Sandbox Code Playgroud)

(到现在为止它会接受my.name12或者my.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
Run Code Online (Sandbox Code Playgroud)

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

有一个错误,.(点)必须被转义,所以它应该是\..\必须以字符串形式转义(因此可能\\.),具体取决于语言

  • 如果您想知道确定什么是正确的电子邮件地址有多"困难":http://en.wikipedia.org/wiki/Email_address (5认同)

Dan*_*rth 6

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