【问题标题】:difference in regex logic正则表达式逻辑的差异
【发布时间】:2014-10-23 10:11:58
【问题描述】:

在我的网站中,我使用下面的正则表达式来验证电子邮件。

^[a-zA-Z0-9]+[a-zA-Z0-9_.-]+[a-zA-Z0-9_-]+@[a-zA-Z0-9]+[a-zA-Z0-9.-]+[a-zA-Z0-9]+.[a-z]{2,4}$

我的疑惑是:

  1. 我可以将以下正则表达式用于相同的功能吗?

    ^[a-zA-Z0-9_.-]+@[a-zA-Z0-9.-]+.[a-z]{2,4}$
    
  2. 我问这个的原因是,我试图研究它的意思。所以我很困惑

    [a-zA-Z0-9_.-] 覆盖[a-zA-Z0-9][a-zA-Z0-9_-] 的所有实例

我不确定,因为我是初学者。

我从

那里得到了正则表达式

http://regexlib.com/

我检查了http://regex101.com/#pcre 中的两个正则表达式。而且我找不到任何结果差异。可能是因为我的知识有限

请澄清一下。提前感谢大家

【问题讨论】:

  • 它们没有完全相同的功能,但你的短正则表达式比长正则表达式更好,因为它避免了长正则表达式中出现的灾难性回溯。
  • @nhahtdh,谢谢你..我可以知道长正则表达式输出的确切变化是什么吗? :)
  • 长的不接受用户部分小于3个字符ad@gmail.com,不接受域小于6个字符myname@x.com。另一件事,请在最后一个.添加转义。
  • @nhahtdh,^[a-zA-Z0-9_.-]{3,}@[a-zA-Z0-9.-]{6,}.[a-z]{2,4}$。是否等于正则表达式?
  • 这些正则表达式都不好。您需要接受本地部分包含加号的电子邮件地址(我的有一个);等号、感叹号、星号和您当前排除的许多其他标点符号也是有效的,尽管不像 plus 那样常见,它在许多安装中都有自己的有用功能。

标签: regex email-validation


【解决方案1】:

也许这不是你要找的答案,但我不得不说我最终得到了这种电子邮件验证:^.+@.+\..{2,}$ 修剪后。

它检查什么?存在一些符号,@ 本身,一些其他符号,点,以及顶级域的至少两个符号。它说“老兄,应该有一封电子邮件,而不是你搞笑的用户名”。我想这就够了。

顺便说一句,.[a-z]{2,4}$ 在检查 TLD 时是一个巨大的错误,因为很少有流行的域名超过 4 个符号(即.travel)和a lot of less popular ones

为什么我认为您不需要详细的验证?首先,there are a lot of requirements 无论如何你都会错过的。您知道电子邮件地址中允许使用西里尔符号吗?

还有,请想一想你想从这个验证中得到什么?避免不正确的电子邮件?你不会的。有人会输入一封满足您所有要求的电子邮件,但无论如何它都是不正确的。 email@gmial.com 好用吗?不,它会被正则表达式检查吗?恐怕,答案又是“不”了。

因此,最好说明用户应提供有效电子邮件以获取确认邮件,并在电子邮件文本中说明“如果您不是在 mysite.com 注册的人,请忽略此信” .

因为 regexp 永远无法过滤足够的内容,但您可能会因此失去几个电子邮件地址奇怪的用户。


因为这应该是您问题的答案:

  1. 它不会是相同的功能,但两个正则表达式都远非完美。
  2. 长正则表达式检查登录中的第一个符号不能是点、破折号或下划线,最后一个符号不能是点,而其他符号可能是,但要避免登录可能少于 3 个符号的事实。短正则表达式更好(= 更简单),但不符合上述要求。
  3. 因此,如果您想使用您的变体,只需从中删除4。如果你需要原版的逻辑,你不能让它更短。
  4. 使用以下示例可能会发现差异:.mail@mail.coma@gmail.comgmail@a.com

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    相关资源
    最近更新 更多