验证电子邮件的RegEx有什么问题?

Tes*_*act 7 regex email-validation

这是验证电子邮件的正则表达式 - \S+@\S+\.\S+我没有写它.我是正则表达式的新手,并不能很好地理解它们.

我有一些问题:

  1. 什么是上述正则表达式?
  2. 验证电子邮件的RegEx有什么好处

Pao*_*ino 18

"我如何使用正则表达式验证电子邮件"是正则表达式中最常见的问题之一,唯一真正的好答案是"你没有".它已 很多 场合在这个网站上讨论过.你要明白那是什么,如果你真的想追随规范,你的正则表达式将看起来像这样.显然,这是一种怪物,更多的是一种练习,表明坚持你应该接受的东西是多么可笑.考虑到这一点,如果你绝对肯定需要知道电子邮件地址是有效的,唯一真正的检查方法是实际向电子邮件地址发送邮件并检查它是否反弹.否则,这个正则表达式将正确验证大多数情况,并且在很多情况下大多数情况就足够了.此外,该页面将讨论尝试使用正则表达式验证电子邮件时遇到的问题.


Gee*_*ert 7

我只是回答你的第一个问题,从技术正则表达的角度来看.

正则表达式有什么问题\S+@\S+\.\S+,它有可能执行得太慢.如果有人输入如下所示的电子邮件字符串,您需要验证它会发生什么?

a@b.cdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789

或者更糟糕的是(是的,这是点后的100 @):

@.@@@@@@@@@@@@@@@@@@@@@@@@@\@@@@@@@@@@@@@@@@@@@@@@ @@@\@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@

缓慢发生.首先,正则表达式会贪婪地匹配第一个尽可能多的字符\S+.因此,它最初将匹配整个字符串.然后我们需要@字符,所以它会回溯直到找到一个.那时我们还有另一个\S+,所以,它会消耗所有东西,直到字符串结束.然后它需要再次回溯直到找到一个点.你能想象在正则表达式最终在第二个电子邮件字符串上失败之前会发生多少回溯吗?

为了消除回溯,我建议在这种情况下使用所有格字符类,这样做的另一个好处是不允许在一个字符串中使用多个@.

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

我针对"100 @的电子邮件"对两个正则表达做了快速基准测试.我的速度快了约95倍.