用于电子邮件验证的两种regex变体

用于电子邮件验证的两种regex变体,regex,Regex,我有这两个正则表达式,都是用来验证电子邮件的。 第一个来自ASP.NET电子邮件正则表达式验证程序,第二个是我在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/javascri

我有这两个正则表达式,都是用来验证电子邮件的。 第一个来自ASP.NET电子邮件正则表达式验证程序,第二个是我在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>

var regex=/^\w+([-+.\']\w+*@\w+([-.]\w+*\.\w+)([-.]\w+*/;
变量regex2=/^([a-zA-Z0-9\.-\+])+\@([a-zA-Z0-9\-])+)+([a-zA-Z0-9]{2,4})+$/;
警报(正则表达式测试)nhassyk@yahoo.co.ukkkk'));
警报(regex2.test)nhassyk@yahoo.co.ukkkk'));
“更好”是一个相当主观的术语——它取决于你到底在寻找什么

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

第二个域没有在第一个域的任何地方使用下划线,但这很简单,因为顶级域中没有下划线。它也比较慢,因为
{2,4}+$/
会将地址的末尾分成2、3或4组,直到它“正确”为止。应该将其更改为
{2,})$
以加快运行速度


归根结底,这将取决于你希望被认为是一个有效的电子邮件地址。

实际上,这两个地址并不完美

让我们把它们做得更好:因为
[a-zA-Z0-9.]
\w
是相同的,所以我们使用第二个变体。
有一级域,如
travel
,因此我们将增加它的最大长度,但当然我们不会像在第一个正则表达式中那样使用
*

毕竟,第二个正则表达式有一个错误——不应该有最后一个加号。我们需要一级域名,但只有一个

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

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

有人知道吗:有比6个符号更长的一级域名吗


更新:这是一篇关于根据RFC标准验证电子邮件的好文章。最后一种变体给人留下了深刻印象。

没有客观的答案来判断哪一种“更好”。这完全取决于您对电子邮件格式的要求。如果它们都满足您认为应该和不应该是电子邮件的要求,并且具有适当的效率,那么这取决于您。只有一个允许
1234@hello.com
123@123.123
,它们是有效的电子邮件吗?不要在魔兽世界里这么匆忙!多谢各位
ALLFINANZBERATUNG
和其他一些令人惊讶的产品:我认为,试图满足电子邮件验证的所有要求可能会让人发疯。在本例中,我们没有考虑256个符号的最大长度,也没有检查Unicode字符等等。。。但有人在实际应用中需要它吗?不管怎样,我们可以使用
[a-zA-Z0-9]{2,}
(或者
[a-zA-Z]{2,}
)向RFC 2822迈出一小步