电子邮件地址的正则表达式出错

时间:2014-10-01 08:01:23

标签: regex

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

^[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这样的地址匹配 如何修复此表达式以避免此错误?

3 个答案:

答案 0 :(得分:1)

这部分(开头):

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

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

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

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

Regular expression visualization

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

除非您有充分的理由不使用自动正则表达式来验证电子邮件地址。他们是一个复杂的野兽和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

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