正则表达式验证邮箱时,为什么包含连字符的域名会被判定无效? 宇文博泽 提问于 2026-01-29 01:08:37 阅读 83 前端 我在做表单验证时用正则匹配邮箱,写的是^w+@[a-zA-Z_]+?.[a-zA-Z]{2,3}$,但测试test.user@example-co.uk时返回false。明明是合法邮箱啊,哪里出错了? 试过把域名部分改成[a-zA-Z0-9-]+,但这样又匹配了像abc@-test.com这种开头带连字符的错误地址。有没有更精准的写法同时允许域名中的连字符和多个点? 异步编程 我来解答 赞 18 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 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 这种明显错误的地址,也会被过滤掉。 写正则这事真是个细活儿,稍微不注意就漏了边界条件。我也是踩了不少坑才总结出这个版本,希望对你有帮助! 回复 点赞 15 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%准确挺难的,实际项目里有时候简单校验格式就够了,没必要太纠结所有边缘情况。 回复 点赞 12 2026-01-30 22:02 加载更多 相关推荐 2 回答 50 浏览 React密码强度验证如何有效检测特殊字符? 我在做一个密码强度验证的React组件,要求密码必须包含至少一个特殊字符。写了正则表达式检测,但检测总是失败,明明输入了@符号也没反应,哪里出问题了? 这是我的表单处理代码,用了onChange实时验... 皇甫凌硕 安全 2026-02-17 13:04:30 2 回答 59 浏览 Postman发送JSON请求包含CSS样式字符串时返回400错误怎么办? 我在Postman里测试API时,发送POST请求的JSON数据里有一个字段需要包含CSS样式字符串,比如: body { background-color: #f0f0f0; font-family... 闲人俊蓓 前端 2026-02-14 20:28:06 2 回答 87 浏览 CORS域名验证时,为什么多个子域名配置会覆盖之前的规则? 我在配置CORS时遇到奇怪的问题,后端设置了允许两个子域名api.example.com和test.example.com,但实际请求时只有最后一个配置生效。比如先写: header("Access-... 皇甫培培 安全 2026-02-10 19:43:23 2 回答 31 浏览 Postman Tests里怎么判断响应体包含某个CSS类名? 我在用 Postman 做接口测试,返回的是 HTML 片段,想验证里面有没有包含一个叫 .btn-primary 的 CSS 类。试了 pm.response.text().includes('.b... 东方世杰 工具 2026-03-23 03:08:20 2 回答 34 浏览 正则表达式怎么匹配中文字符? 我在写一个表单验证,需要限制用户只能输入中文、英文和数字,但我的正则好像对中文不起作用。试过用 /[u4e00-u9fa5]/,但有时候会漏掉一些生僻字或者标点。 比如下面这段代码,输入“你好!”的时... ♫英杰 前端 2026-03-15 11:42:19 2 回答 17 浏览 正则表达式怎么匹配中文字符? 我在写一个表单验证,想用正则判断用户输入的是否是中文,但试了几个写法都不对。比如我用了 /[u4e00-u9fa5]/,结果输入“你好123”也能通过,明明里面有数字啊! 是不是这个正则只匹配了部分字... Newb.成娟 前端 2026-03-08 21:42:21 2 回答 88 浏览 表单验证时如何实时监听输入并动态显示错误提示? 我正在做一个注册表单,想在用户输入时就实时验证邮箱格式,但不知道怎么把验证逻辑和DOM更新结合起来。试过用input事件监听,但错误信息总是显示不对。 比如下面这段代码,输入非法邮箱时没反应,控制台也... 一乐萱 交互 2026-02-24 16:55:21 2 回答 32 浏览 Vite打包库时为什么第三方依赖会被包含进输出文件? 我用Vite的Library模式打包一个React组件库,但发现打包后的文件包含了react-i18next的代码,明明在vite.config里设置了external排除。试过调整optimizeD... 萌新.一鸣 工具 2026-02-18 16:19:26 1 回答 62 浏览 子域名间CORS配置为什么还是被拦截? 我在做子域名间的数据交互时遇到了CORS问题。主域名是example.com,后端接口在api.example.com,前端在www.example.com发起请求。按照教程设置了Access-Con... 长春 安全 2026-02-17 19:39:22 2 回答 58 浏览 为什么我的表单验证明明输入了内容却提示必填项未填写? 我在做用户注册表单时遇到了奇怪的问题。输入邮箱后点击提交,控制台却显示邮箱字段为空,必填提示没消失。之前用required属性没问题啊,这是为什么? 代码结构是这样的: <form @submi... 令狐培聪 组件 2026-02-17 01:41:38
你可以试试这个改进版的正则:
重点说下改动的地方:
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%准确挺难的,实际项目里有时候简单校验格式就够了,没必要太纠结所有边缘情况。