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

Posted

技术标签:

【中文标题】验证电子邮件不盲目接受的最简单的正则表达式是啥? [关闭]【英文标题】:What is the simplest regular expression to validate emails to not accept them blindly? [closed]验证电子邮件不盲目接受的最简单的正则表达式是什么? [关闭] 【发布时间】:2010-10-19 01:15:08 【问题描述】:

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

我会发送一封确认邮件,以 handshake validation 的方式发送。

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

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

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

【问题讨论】:

认为“最简单”与“最好”完全一样主观,在其他条件不变的情况下,该线程有大量的正则表达式,但如果你这么认为...... 耸耸肩 如果您进行正则表达式验证,为什么要将表达式限制为简单的东西?让我们使用一些好的东西,这不会影响您的代码提供更好的结果。 此验证将在您的应用程序中的哪个位置进行?在 POST 上?你在做什么来清理输入? ^(?i)[A-Z0-9+_.-]+@(?:.*).(?:.*)$, ^ 表示开始,$ 表示结束,( ?i) 不区分大小写的匹配。 @ 之前只允许字母数字、'+'、'_'、'-'。这一个,?:对于没有部分匹配的子组形成,只有 1 个完整匹配 【参考方案1】:

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

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

包含@字符:

@

包含@ 和它之后某处的句点:

@.*?\.

在@之前、句点之前和之后至少有一个字符:

.+@.+\..+

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

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

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

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

并且只接受一个句点[外部编辑:不推荐,与有效的电子邮件地址不匹配]

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

【讨论】:

如果您看一下 RFC 6531 的内容,如果您仔细研究 RFC 3696,您可能会得出这样的结论:验证电子邮件的唯一方法是发送确认电子邮件。我认为在电子邮件地址上使用正则表达式的真正重点应该是帮助用户防止拼写错误,这就是像这样的简单正则表达式发挥作用的地方。 完美,@AmoebaMan17。 RegEx 可以验证电子邮件地址的格式,但不能验证电子邮件地址的内容。也就是说,你的完全验证了格式。发送电子邮件是验证内容的唯一方法。 test@test.com 上不起作用? 为了防止字符串以句点结尾,我做了这样的修改:^[^@\s]+@[^@\s]+\.[^@\.\s]+ $ 是的,不要使用最后一个。它与许多有效选项不匹配。例如我@provider.co.uk。【参考方案2】:
^\S+@\S+$

【讨论】:

这将匹配无效地址。任何正则表达式都可以,但这个会匹配常见的拼写错误,例如 test@***..com(注意双点。)请提供一个更好的例子。 它应该是一个最简单、非常粗略的过滤器,我不明白为什么双倍周期比所有其他具有相似复杂性成本的错误更能覆盖它们。 +1。无论如何,这是一个主观问题,这很简单。 是的,如果你不想使用完整的验证正则表达式,这是一个很好的简单近似 +1 尝试完全通过正则表达式“验证”电子邮件地址是徒劳的。这可以捕获最简单的错误类型;其余的可以通过尝试发送邮件来找到。以上还允许 Unicode (->Punycode) 域,大多数“聪明”的正则表达式都失败了。【参考方案3】:

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

只有 1 个@ 多个域和子域

【讨论】:

这将在O'Connor@example.com 和许多其他人上失败。撇号和其他字符在电子邮件中比您想象的更常见,尤其是在美国以外。我建议不要使用这个正则表达式。【参考方案4】:

我认为 AmoebaMan17 对表达式的这个小调整应该会阻止地址以点开头/结尾,并且还会阻止多个点彼此相邻。在消除常见问题的同时尽量不让它变得复杂。

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

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

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

【讨论】:

这不适用于@之前的单个字符 @hello.com 根据这​​个正则表达式是有效的。好像不行。【参考方案5】:

Take your pick.

这是符合RFC 2822 Section 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])+)\])

以防万一你好奇。 :)

【讨论】:

只是给现在看到这个的任何人的注释:这不符合 RFC 2822。 这也不简单:) 它还会阻止大量有效的电子邮件地址。尤其是那些使用国际字符/语言的。

以上是关于验证电子邮件不盲目接受的最简单的正则表达式是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

欧芹验证中带有自定义域的电子邮件的正则表达式是啥

在 C# 字符串中摆脱零宽度空间的最简单方法

Java中电子邮件验证的正则表达式

为啥 jQuery 的电子邮件验证正则表达式如此简单?

ASP.NET 电子邮件验证器正则表达式

简单正则表达式的问题