用于电子邮件验证的两种正则表达式变体

时间:2012-06-20 20:49:44

标签: regex

我有这两个正则表达式,都用于验证电子邮件。 第一个来自ASP.NET电子邮件regex验证器,第二个是我在SO上找到的。 我的问题是它们之间的区别是哪个更好?

/^\w+([-+.\']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/

/^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/

两个正则表达式都允许ukkkk

<script type="text/javascript">

var regex = /^\w+([-+.\']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/;
var regex2 = /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;

alert(regex.test('nhassyk@yahoo.co.ukkkk'));
alert(regex2.test('nhassyk@yahoo.co.ukkkk'));

</script>

2 个答案:

答案 0 :(得分:1)

“更好”是一个非常主观的术语 - 它取决于你究竟在寻找什么。

第一个正则表达式允许在电子邮件地址的第一部分使用单引号字符并使用包含下划线的\ w +,因此如果您将其用作“更好”的标准之一,则更具包容性。

第二个不会在第一个地方使用下划线,但这是微不足道的,因为顶级域中没有下划线。它也较慢,因为{2,4}+$/会将地址的末尾分解为2,3或4组,直到它“正确”为止。应将其更改为{2,})$以更快地运行。

最终,它将归结为您希望被视为有效的电子邮件地址。

答案 1 :(得分:1)

实际上,它们都不完美。

让我们做得更好:由于[a-zA-Z0-9_]\w相同,我们使用第二种变体。
travel等拳头级域名,因此我们会增加它的最大长度,但当然我们不会像第一个正则表达式那样使用*
毕竟,第二个正则表达式中存在错误 - 不应该有最后一个加号。我们需要有一级域名,但只有一个。

结果如下:^([\w\.\-\+])+\@(([\w\-])+\.)+([a-zA-Z0-9]{2,6})$

无论如何,nhassyk@yahoo.co.ukkkk是有效的电子邮件,即使它不存在。

有人知道吗:第一级域名是否超过6个符号?

更新Here是一篇关于根据RFC标准验证电子邮件的精彩文章。最终版本非常令人印象深刻。