正则表达式验证邮箱时,为什么包含连字符的域名会被判定无效? 宇文博泽 提问于 2026-01-29 01:08:37 阅读 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 条解答 百里淑涵 Lv1 你的正则确实有点问题,主要是对域名部分的处理不够严谨。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°子瀚 Lv1 你的问题确实是正则写得不够严谨导致的。邮箱验证这块坑挺多,我来说说怎么改。 先看域名部分的问题:你现在的写法确实会匹配到不合法的连字符开头域名,因为只加了个-没控制位置。正确的做法是允许连字符存在,但不能出现在开头或结尾,同时还要支持多个点号。 给你一个更精确的正则: ^[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 加载更多 相关推荐 1 回答 20 浏览 React密码强度验证如何有效检测特殊字符? 我在做一个密码强度验证的React组件,要求密码必须包含至少一个特殊字符。写了正则表达式检测,但检测总是失败,明明输入了@符号也没反应,哪里出问题了? 这是我的表单处理代码,用了onChange实时验... 皇甫凌硕 安全 2026-02-17 13:04:30 1 回答 19 浏览 Postman发送JSON请求包含CSS样式字符串时返回400错误怎么办? 我在Postman里测试API时,发送POST请求的JSON数据里有一个字段需要包含CSS样式字符串,比如: body { background-color: #f0f0f0; font-family... 闲人俊蓓 前端 2026-02-14 20:28:06 1 回答 47 浏览 CORS域名验证时,为什么多个子域名配置会覆盖之前的规则? 我在配置CORS时遇到奇怪的问题,后端设置了允许两个子域名api.example.com和test.example.com,但实际请求时只有最后一个配置生效。比如先写: header("Access-... 皇甫培培 安全 2026-02-10 19:43:23 2 回答 5 浏览 Vite打包库时为什么第三方依赖会被包含进输出文件? 我用Vite的Library模式打包一个React组件库,但发现打包后的文件包含了react-i18next的代码,明明在vite.config里设置了external排除。试过调整optimizeD... 萌新.一鸣 工具 2026-02-18 16:19:26 1 回答 26 浏览 子域名间CORS配置为什么还是被拦截? 我在做子域名间的数据交互时遇到了CORS问题。主域名是example.com,后端接口在api.example.com,前端在www.example.com发起请求。按照教程设置了Access-Con... 长春 安全 2026-02-17 19:39:22 1 回答 34 浏览 为什么我的表单验证明明输入了内容却提示必填项未填写? 我在做用户注册表单时遇到了奇怪的问题。输入邮箱后点击提交,控制台却显示邮箱字段为空,必填提示没消失。之前用required属性没问题啊,这是为什么? 代码结构是这样的: <form @submi... 令狐培聪 组件 2026-02-17 01:41:38 1 回答 52 浏览 为什么keypress事件无法捕获输入的字符? 在给输入框做实时验证时发现,用keypress事件监听输入,event.charCode返回的值总不正确,比如输入字母a会得到97,但转成字符串却变成undefined... 尝试过这样写: inpu... 闲人树珂 交互 2026-02-14 11:28:31 2 回答 11 浏览 前端密码策略验证总是失败怎么办? 我在做用户注册页面时要实现密码复杂度验证,要求必须包含大写字母、数字和特殊符号,且长度至少8位。但测试时发现符合要求的密码也会被拦截。 我写了这样的验证函数: function checkPasswo... 西门鸿吉 安全 2026-02-12 17:33:31 2 回答 91 浏览 为什么Promise链中的错误没有被捕获到? 在写用户注册流程时,我用Promise链依次调用验证邮箱、发送验证码和提交表单的API。但当验证邮箱失败时,外面的catch始终没接住错误,控制台反而直接报错了。 代码是这样的:checkEmail(... IT人文雯 前端 2026-02-11 11:50:32 2 回答 13 浏览 域名分片后静态资源加载反而变慢了?怎么回事? 最近给项目做了域名分片优化,把静态资源分到三个子域名加载,结果发现图片和JS文件加载时间比之前更久了,这是为什么啊? 之前都是用主域名加载资源,现在改成、script src="cdn2.exampl... 设计师英杰 优化 2026-02-11 08:22:36
你可以试试这个改进版的正则:
重点说下改动的地方:
1. 域名部分允许连字符,但要求连字符不能出现在开头或结尾。
2. 支持多个点号,比如 example.co.uk 这种二级域名。
直接拿你那个 test.user@example-co.uk 测试,这回就能正确匹配了。至于像 abc@-test.com 这种明显错误的地址,也会被过滤掉。
写正则这事真是个细活儿,稍微不注意就漏了边界条件。我也是踩了不少坑才总结出这个版本,希望对你有帮助!
先看域名部分的问题:你现在的写法确实会匹配到不合法的连字符开头域名,因为只加了个
-没控制位置。正确的做法是允许连字符存在,但不能出现在开头或结尾,同时还要支持多个点号。给你一个更精确的正则:
重点解释下域名部分
[a-zA-Z0-9.-]+.[a-zA-Z]{2,}:1.
[a-zA-Z0-9.-]这里允许字母、数字、点和连字符2. 加了限制确保连字符不会出现在首位或末尾
3. 至少要有一个点后面接顶级域名
JS里面可以直接用这个正则来验证,像
example-co.uk这种域名就都能正确匹配了,而且会拒绝-test.com这种非法格式。当然,邮箱验证完全做到100%准确挺难的,实际项目里有时候简单校验格式就够了,没必要太纠结所有边缘情况。