/^[^\s@]+@[^\s@]+\.[^\s@]+$/ 更可靠,因它排除空格和孤立@、要求点号后有内容,能拦截 test@@example...com 和 @site.co 等非法格式,虽不验证dns,但适合前端即时反馈。

邮箱格式校验为什么 /^[^\s@]+@[^\s@]+\.[^\s@]+$/ 比 /^.+@.+\..+$/ 更可靠
简单匹配 .+@.+\..+ 会放过 test@@example...com 或 @site.co 这类明显非法输入。真实表单需要拒绝空白、连续符号和末尾点号。
更稳妥的写法是限定每段非空、不含空格和 @:
/^[^\s@]+@[^\s@]+\.[^\s@]+$/
- 开头
^[^\s@]+:本地部分不能有空格或@,排除" a@b.c" - 中间
@[^\s@]+:域名主体同理,防test@.com - 结尾
\.[^\s@]+$:确保点号后还有内容,拦住test@example.
注意:这个正则不验证 DNS 合法性(如 test@xxx 仍会通过),但对前端即时反馈已足够。真要严格校验,得交由后端发 SMTP 探测。
input[type="tel"] 的正则怎么避开国际号码的坑
用户可能输 +86 138-1234-5678、(010) 1234-5678 或纯数字 13812345678。硬性要求统一格式会激怒用户,应以“提取有效数字”为目标,而非“强制格式”。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
- 先用
value.replace(/[\s\-\(\)\+]/g, '')清洗,再校验长度(如大陆手机号用^1[3-9]\d{9}$) - 若需保留原始格式用于展示,校验逻辑必须和清洗逻辑解耦——别在
pattern属性里塞复杂正则,它只支持基本语法且不报错细节 - 避免用
^[\d\s\-\(\)\+]{11,15}$这类宽泛匹配,它会放过++++++
密码强度校验该用一个正则还是多个 test()
一个正则写成 ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#]).{8,}$ 看似简洁,但用户输错时完全不知道缺哪项。实际体验中,分项检测 + 实时提示更友好。
- 用四个独立
test():检查小写、大写、数字、特殊字符,各自对应一个提示文案 - 长度单独判断,避免
.{8,}和其他断言耦合导致逻辑难调试 - 正则中慎用
.*开头的断言,某些浏览器(如旧版 Safari)对长字符串回溯性能差,输 50 个字符可能卡顿
示例片段:
const hasLower = /[a-z]/.test(pwd);<br>const hasUpper = /[A-Z]/.test(pwd);<br>const hasDigit = /\d/.test(pwd);<br>const hasSpecial = /[!@#$%^&*]/.test(pwd);
为什么 pattern 属性在表单提交时静默失败
<input pattern="..."> 触发校验的条件很隐蔽:仅当用户未修改过该字段(input.validity.customError === false),且调用 form.reportValidity() 或点击原生提交按钮时才生效。手动 submit() 不触发。
- 不要依赖
pattern做唯一校验,它无法捕获 JS 动态改值、粘贴事件等绕过场景 - 移动端软键盘可能不按
pattern切换类型(比如pattern="[0-9]*"在 iOS 上仍弹出字母键盘) - 错误提示文案由浏览器控制,无法自定义;想统一风格,得监听
invalid事件并event.preventDefault(),再手动显示提示
最易被忽略的一点:正则字面量写进 pattern 时,^ 和 $ 自动隐含,不用显式写,写了反而可能出错。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










