常用正则模式
前面十章讲的是"零件",这一章把它们组装成实战中最常用的一批模式——邮箱、手机号、URL、身份证、IP、日期等。每个模式都配上拆解说明和工程提示,你可以在项目里直接拿来用,也可以基于此微调。
中国大陆手机号
这是国内项目里出现频率最高的正则之一。核心规则:11 位,第一位 1,第二位 3 到 9。后面九位任意数字。看下面这个简化版如何拆解:
// 中国大陆手机号(11 位)
// 简化版:第一位 1,第二位 3-9,后 9 位任意数字
/^1[3-9]\d{9}$/.test("13812345678"); // true
/^1[3-9]\d{9}$/.test("12812345678"); // false (第二位不能是 2)
/^1[3-9]\d{9}$/.test("1381234567"); // false (只有 10 位)
// 拆解:
// ^1 第一位必须是 1
// [3-9] 第二位是 3 到 9(覆盖移动 联通 电信 广电号段)
// \d{9} 后面 9 位任意数字
// $ 字符串结尾
//
// 工程提示:运营商会不断放新号段
// 早期:^1[3-8]\d{9}
// 现今:^1[3-9]\d{9}(含广电 192 号段)
// 严格版:列举所有合法号段 ^(13\d|14[5-9]|15[^4]|16[2567]|17[^4]|18\d|19[^49])\d{8}
// 但维护成本高,大多项目用简化版工程提示:运营商会不断放新号段(如广电的 192 号段),严格列举所有合法号段维护成本极高,且校验通过也不代表号码真实存在(还要靠短信验证码)。所以大多数项目用简化版 + 短信验证码组合,而不是追求"完美的正则"。
邮箱格式
邮箱正则难写是因为 RFC 5322 规范允许极其多样的格式(引号、注释、IP 域名等),严格遵循 RFC 的正则长达数千字符。实际项目都用简化版——覆盖 99% 常见邮箱,牺牲边缘情况。
// 邮箱格式(参考 HTML5 规范 + 常用简版)
// 简版:字母数字 + @ + 字母数字 + 点 + 字母
/^[\w.+-]+@[\w-]+(\.[\w-]+)+$/.test("user@example.com"); // true
/^[\w.+-]+@[\w-]+(\.[\w-]+)+$/.test("a.b+c@d.e-f.com"); // true
/^[\w.+-]+@[\w-]+(\.[\w-]+)+$/.test("not-email"); // false
/^[\w.+-]+@[\w-]+(\.[\w-]+)+$/.test("@example.com"); // false
// 拆解:
// [\w.+-]+ 用户名:字母数字下划线 + . + - 符号
// @ 必须的 at 符号
// [\w-]+ 域名主体:字母数字 + -
// (\.[\w-]+)+ 至少一段点 + 域名(如 .com 或 .co.uk)
//
// 注意:邮箱规范(RFC 5322)极其复杂,允许引号、空格、IP 域等
// 严格 RFC 校验的正则长达几千字符,实际没人用
// 生产推荐:用简化版 + 发邮件激活(真正校验靠邮件)工程建议:生产环境的邮箱校验推荐"简化正则 + 发邮件激活链接"双层校验。真正能确认邮箱有效性的,只有"用户收到邮件并点击激活"——任何正则都无法替代这一步。
URL 网址
URL 的格式比邮箱更复杂(协议、域名、端口、路径、查询参数、锚点),完整 URL 正则也很长。日常用得最多的是"是不是合法 http(s) 网址"这种简化场景。
// URL / 网址
// 协议 + 域名 + 路径(允许 http 或 https)
/^https?:\/\/[\w.-]+(\.[\w.-]+)+(\/[\w./?%&=-]*)?$/.test("https://example.com");
// true
/^https?:\/\/[\w.-]+/.test("ftp://a.com"); // false (只匹配 http/https)
/^https?:\/\/[\w.-]+/.test("https://"); // false (缺域名)
// 拆解:
// ^https?:\/\/ http 或 https + 冒号斜杠斜杠
// [\w.-]+ 域名(字母数字 点 短横线)
// (\.[\w.-]+)+ 至少一段点 + 域名段(如 .example.com)
// \/[\w./?%&=-]* 可选路径(/path?key=value 等)
//
// 提取网页里的所有链接(JS 简易版)
const html = 'visit <a href="https://a.com">A</a> or http://b.com';
const links = html.match(/https?:\/\/[^\s"<]+/g);
// ["https://a.com", "http://b.com"]如果要从 HTML 文本里批量提取链接,用全局标志配合"非空白非引号"的排斥型字符类即可,避免贪婪跨标签。爬虫和文本分析里这种用法很常见。
身份证号
18 位身份证号的结构是固定的:6 位地区码 + 8 位生日 + 3 位序号 + 1 位校验码。但格式正确不代表号码真实——校验码算法、地区码真伪、生日合法性都需要额外的业务校验。
// 中国身份证号(18 位,简化校验)
// 18 位身份证:6 位地区 + 8 位生日 + 3 位序号 + 1 位校验
/^\d{6}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/
.test("11010119900101001X"); // true
// 拆解:
// ^\d{6} 前 6 位地区码
// (18|19|20)\d{2} 年份(1800-2099)
// (0[1-9]|1[0-2]) 月份(01-12)
// (0[1-9]|[12]\d|3[01]) 日期(01-31,不校验大小月)
// \d{3} 3 位序号(奇男偶女)
// [\dXx]$ 校验位(数字或 X/x)
//
// 注意:严格校验需计算最后一位校验码(ISO 7064 算法)
// 本正则只做格式校验,实际业务还要做:
// 1. 校验码算法(防误填)
// 2. 地区码是否真实存在(防伪造)
// 3. 生日是否合法(如 2 月 30 日)工程提示:正式业务里,身份证校验通常分三步:正则做基础格式过滤、ISO 7064 算法校验最后一位防误填、调公安接口查真实性。任何正则都不能完全替代接口校验。
IP、日期、其他
下面是几个其他高频模式的速查表——IPv4 地址、日期格式、邮政编码、QQ 号、中文字符、强密码。每个都附了简化版和严格版的差异。
// IPv4 地址
/^(\d{1,3}\.){3}\d{1,3}$/.test("192.168.1.1"); // true
// 严格版(每段 0-255)
/^((25[0-5]|2[0-4]\d|1?\d?\d)\.){3}(25[0-5]|2[0-4]\d|1?\d?\d)$/.test("255.255.255.255");
// true
// 日期 YYYY-MM-DD
/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/.test("2026-08-05"); // true
// 邮政编码(6 位数字)
/^\d{6}$/.test("100000"); // true
// QQ 号(5-12 位,首位非 0)
/^[1-9]\d{4,11}$/.test("123456"); // true
// 中文字符
/^[\u4e00-\u9fa5]+$/.test("一段中文"); // true
// 强密码(8 位以上,含大小写字母和数字)
/^[a-zA-Z0-9]{8,}$/.test("Abc12345"); // true- IPv4 严格版:每段必须在 0-255 之间,简化版只校验"1-3 位数字"格式。
- 日期:正则无法校验"2 月 30 日"这种逻辑错误,业务里要配合日期库。
- 中文范围:用 Unicode 码点区间,处理生僻字要扩展范围。
速查表使用原则
- 不要追求完美:正则只做"明显错误过滤",真正校验靠业务接口。
- 简单优于复杂:能校验 90% 常见情况的简短正则,比覆盖 99% 的长正则更易维护。
- 加锚点:表单校验必须两端锚定,否则前后多余字符也能通过。
- 测试用例:每个正则都准备合法和非法用例,推荐用 regex101 测试。
下一章(也是最后一章)讲工具与学习资源——除了 regex101 还有那些好用的正则工具和学习材料。
← 上一篇 标志位
下一篇 工具与学习资源 →