常用正则模式

前面十章讲的是"零件",这一章把它们组装成实战中最常用的一批模式——邮箱、手机号、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

速查表使用原则

下一章(也是最后一章)讲工具与学习资源——除了 regex101 还有那些好用的正则工具和学习材料。

← 上一篇 标志位

下一篇 工具与学习资源

✈️💬