验证电子邮件以免盲目接受的最简单的正则表达式是什么?[关闭]


80

当用户在我的网站上创建帐户时,我想对服务器进行验证,以使电子邮件不接受所有输入。

我将发送确认,以进行握手验证

我在寻找简单东西,而不是最好的东西,但又不是太简单,不能验证任何东西。我不知道限制在哪里,因为任何正则表达式都无法进行正确的验证,因为无法使用正则表达式来进行验证。

我试图限制正则表达式固有的正弦和视觉复杂性,因为在这种情况下,任何正确的用法都可以。

我可以使用什么正则表达式来做到这一点?


以为“最简单”与“最好”完全一样的主观性,等等,而该线程具有正则表达式的聚宝盆,但如果您这么认为……耸耸肩
Mihai Limbășan 09年

如果进行正则表达式验证,为什么将表达式限制为简单的表达式?让我们使用一些好的东西,这不会对您的代码产生任何影响,从而提供更好的结果。
09年

该验证在您的应用程序中的哪个位置?在POST上?您正在做什么清理输入?
Braiam

^(?i)[A-Z0-9 + ..] + @(?:。*)。(?:。*)$,^表示开始,$表示结束,(?i)不区分大小写的匹配。@之前的字符仅允许字母数字,“ +”,“ _”,“-”。这其中,:为没有部分匹配小组形成,只有1个整体匹配?
P萨蒂什南比亚Patro

Answers:


97
^\S+@\S+$

3
这将匹配无效的地址。任何正则表达式都可以,但是这个正则表达式可以匹配常见的拼写错误,例如test @ stackoverflow..com(请注意双点。)请提供一个更好的示例。
Mihai Limbășan 09年

59
它应该是一个最大程度的简单,非常粗糙的过滤器,而且我不明白为什么在所有其他具有类似复杂性成本的操作中,都享有两倍的特权来覆盖它们。
混沌

2
+1。无论如何,这是一个主观的问题,这很简单。
杰森·科恩

2
是的,如果您不想使用完整的验证正则表达式,这是一个很好的简单近似值
猖ion

8
+1试图通过正则表达式完全“验证”电子邮件地址是愚蠢的事情。这可以捕获最简单的错误类型。其余的可以通过尝试发送邮件找到。上面的代码还允许使用Unicode(-> Punycode)域,大多数“聪明的”正则表达式都无法通过它。
bobince

233

可以编写一个只接受符合标准的电子邮件地址的正则表达式。但是,有些电子邮件地址并不严格遵循标准,但仍然有效。

以下是一些用于基本验证的简单正则表达式:

包含一个@字符:

@

包含@及其后的句点:

@.*?\.

@之前,句号之前和之后至少有一个字符:

.+@.+\..+

在句号之前和之后只有一个@,@之前至少一个字符:

^[^@]+@[^@]+\.[^@]+$

用户AmoebaMan17建议进行此修改以消除空格:

^[^@\s]+@[^@\s]+\.[^@\s]+$

并且仅接受一个期间:

^[^@\s]+@[^@\s\.]+\.[^@\.\s]+$

7
如果您看一下RFC 6531的发展趋势,如果仔细看一下RFC 3696,您可能会得出结论,验证电子邮件的唯一方法是发送确认电子邮件。我认为在电子邮件地址上使用正则表达式的真正重点应该在于帮助用户防止输入错误,而这正是像这样的简单正则表达式起作用的地方。
鲍勃·巴克

完美,@ AmoebaMan17。RegEx可以验证电子邮件地址的格式,而不能验证电子邮件地址的内容。也就是说,您将完全验证格式。发送电子邮件是验证内容的唯一方法。
Craig

不会继续test@test.com吗?
阿卜杜勒·哈默德

为了防止字符串以句点结尾,我进行了以下修改:^ [^ @ \ s] + @ [^ @ \ s] + \。[^ @ \。\ s] + $
fyrite

我建议您去除AmoebaMan17的初始^和终端$的版本,以便引导/尾随空格不会阻止您提取电子邮件,即[^@\s]+@[^@\s]+\.[^@\s]+
Tom Wagstaff

4

^ [a-zA-Z0-9 _。+-] + @ [a-zA-Z0-9-] +。[a-zA-Z0-9-。] + $

  • 只有1个 @
  • 几个域和子域

3

我认为对AmoebaMan17表达式的这种细微调整应该使地址以点开头/结尾停止,并且也应停止多个相邻的点。在消除常见问题的同时,尽量避免使其变得复杂。

(?!.*\.\.)(^[^\.][^@\s]+@[^@\s]+\.[^@\s\.]+$)

它似乎正在工作(但我不是RegEx-pert)。解决了我的问题,即用户从句号结尾的句子结尾复制并粘贴电子邮件地址。

即:这是我的新电子邮件地址tabby@coolforcats.com。


这不适用于@之前的单个字符
Andy Hoyle,

根据此正则表达式,<script> alert('hello')</ script> @ hello.com有效。似乎还不行。
dudedev

2

随便你吧。

这是符合RFC 2822第3.4.1节的要求...

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

以防万一你好奇。:)


7
任何人现在看到这只是一个注:不符合RFC 2822
porges

10
而且,这也不简单:)
Dan Diplo 2012年

2
它还将阻止大量有效的电子邮件地址。特别是那些使用国际字符/语言的语言。
鲍勃·巴克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.