我有一个正则表达式来验证电子邮件地址。它看起来像
^[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
这样的地址匹配
如何修复此表达式以避免此错误?
答案 0 :(得分:1)
这部分(开头):
[a-z0-9]+([-+._][a-z0-9]+)*
导致问题。它表示你想要一个或多个字母或数字,然后是一个符号和一个或多个字母组合的0或更多次迭代。您可能想说“开头的字母或数字,然后是0或更多次以下任何字符”,如下所示:
[a-z0-9][a-z0-9+._-]*
@
之后的部分允许用点划线,你确定这是你想要的吗?为了不仅仅为您提供“有效”的代码,请查看Debuggex以了解您当前的正则表达式如何工作以便您可以改进它:)给出了这个漂亮的视觉效果:
答案 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
我实际上在回答这个问题时发现了这个模块,它比我之前使用的那个更好。所以非常感谢你提问:)