【问题标题】:Error in regular expression for e-mail addresses电子邮件地址的正则表达式错误
【发布时间】:2014-10-01 08:01:22
【问题描述】:

我有一个正则表达式来验证电子邮件地址。好像

^[a-z0-9]+([-+._][a-z0-9]+)*@[a-z0-9]+([-.][a-z0-9]{2,})*\.[a-z0-9]+([-.][a-z0-9]{2,})*$

在大多数情况下它可以正常工作,但是当我键入像“qwerty_@mail.com”这样的电子邮件时,这个正则表达式不匹配,尽管它是一个正确的电子邮件地址。 qwerty_1@mail.com 之类的地址确实匹配。
如何修复此表达式以避免此错误?

【问题讨论】:

标签: regex


【解决方案1】:

这部分(开头):

[a-z0-9]+([-+._][a-z0-9]+)*

导致问题。这就是说您想要 1 个或多个字母或数字,然后是符号和 1 个或多个字母的组合的 0 次或多次迭代。您可能想说“开头的字母或数字,然后是以下任何字符 0 次或更多次”,如下所示:

[a-z0-9][a-z0-9+._-]*

@ 后面的部分允许点破折号,你确定这是你想要的吗?为了做的不仅仅是为您提供“有效”的代码,请查看Debuggex 以了解您当前的正则表达式是如何工作的,以便您改进它:) 提供这个漂亮的视觉视图:

【讨论】:

  • 转义字符类中的破折号或将其移动到开头或结尾。
【解决方案2】:

使用此正则表达式来验证电子邮件

^[A-Za-z]([A-Za-z1-9][\.\-\_]?[A-Za-z1-9]?)+@[A-Za-z]+\.[A-Za-z]{3,}$

【讨论】:

  • 为什么要使用它?一些解释可能会有所帮助。
  • 这允许---@---.xx
  • 不允许像“博物馆”这样的顶级域名
  • @sp00m 这对新的正则表达式无效
  • @l'L'l 你可以再检查一遍
【解决方案3】:

除非您有充分的理由,否则不要使用自转正则表达式来验证电子邮件地址。他们是一个复杂的野兽和someone else has already done the work for you

这里是如何使用模块

# Gives us say and always a good idea
use Modern::Perl;

use Email::Valid;

my @addrs = qw/ qwerty_@mail.com
                qwerty_1@mail.com
                qwerty\@mail.com  /;
foreach (@addrs) {
    print "$_ is ";
    print 'in' unless Email::Valid->address($_);
    say   'valid'
}

哪些输出

qwerty_@mail.com is valid
qwerty_1@mail.com is valid
qwerty\@mail.com is invalid

我实际上是在回答这个问题时发现了这个模块,它比我以前使用的那个更好。所以非常感谢你的提问:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 2011-10-14
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    相关资源
    最近更新 更多