正则表达式验证邮箱时,为什么包含连字符的域名会被判定无效?

宇文博泽 阅读 65

我在做表单验证时用正则匹配邮箱,写的是^w+@[a-zA-Z_]+?.[a-zA-Z]{2,3}$,但测试test.user@example-co.uk时返回false。明明是合法邮箱啊,哪里出错了?

试过把域名部分改成[a-zA-Z0-9-]+,但这样又匹配了像abc@-test.com这种开头带连字符的错误地址。有没有更精准的写法同时允许域名中的连字符和多个点?

我来解答 赞 8 收藏
二维码
手机扫码查看
2 条解答
百里淑涵
你的正则确实有点问题,主要是对域名部分的处理不够严谨。JS里面验证邮箱的正则其实挺讲究的,既要支持连字符和多个点,又不能让连字符出现在开头或结尾。

你可以试试这个改进版的正则:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$


重点说下改动的地方:
1. 域名部分允许连字符,但要求连字符不能出现在开头或结尾。
2. 支持多个点号,比如 example.co.uk 这种二级域名。

直接拿你那个 test.user@example-co.uk 测试,这回就能正确匹配了。至于像 abc@-test.com 这种明显错误的地址,也会被过滤掉。

写正则这事真是个细活儿,稍微不注意就漏了边界条件。我也是踩了不少坑才总结出这个版本,希望对你有帮助!
点赞 6
2026-02-01 23:14
Code°子瀚
你的问题确实是正则写得不够严谨导致的。邮箱验证这块坑挺多,我来说说怎么改。

先看域名部分的问题:你现在的写法确实会匹配到不合法的连字符开头域名,因为只加了个-没控制位置。正确的做法是允许连字符存在,但不能出现在开头或结尾,同时还要支持多个点号。

给你一个更精确的正则:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$


重点解释下域名部分[a-zA-Z0-9.-]+.[a-zA-Z]{2,}
1. [a-zA-Z0-9.-]这里允许字母、数字、点和连字符
2. 加了限制确保连字符不会出现在首位或末尾
3. 至少要有一个点后面接顶级域名

JS里面可以直接用这个正则来验证,像example-co.uk这种域名就都能正确匹配了,而且会拒绝-test.com这种非法格式。

当然,邮箱验证完全做到100%准确挺难的,实际项目里有时候简单校验格式就够了,没必要太纠结所有边缘情况。
点赞 8
2026-01-30 22:02