JavaScript校验身份证并提取出生日期需用正则匹配15/18位格式,再按规则补全年份(如“92”→“1992”)、验证日期有效性,最终返回标准YYYY-MM-DD格式;但正则无法替代校验码算法和后端真实验证。

JavaScript 中校验身份证号并提取出生日期,核心是利用正则表达式匹配 15 位或 18 位身份证格式,并从中安全提取年月日。需注意:仅靠正则无法完全验证身份证真实性(如校验码、日期有效性、行政区划),但可高效完成基础格式校验和日期抽取。
支持 15 位和 18 位身份证的正则模式
中国大陆身份证有两种历史格式:15 位(老式,无校验码,出生年为两位)和 18 位(现行标准,含 1 位校验码)。正则需兼顾二者:
-
18 位:`^\d{6}(1[89]|2\d)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$`
— 前 6 位为地址码;第 7–10 位为四位年份(18xx/19xx/20xx);11–12 位为月份;13–14 位为日期;最后三位为顺序码+校验码(X/x 表示校验码为 10) -
15 位:`^\d{6}(8[0-9]|9\d)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}$`
— 前 6 位同上;7–8 位为两位年份(如 92 表示 1992 年);9–10 位为月份;11–12 位为日期;后三位为顺序码(无校验码) - 合并写法(推荐):`^(\d{6})(\d{4}|\d{2})(\d{2})(\d{2})\d{3}[\dxX]?$` — 更侧重提取,不强约束年份范围,配合后续逻辑判断更灵活
从匹配结果中提取标准出生日期(YYYY-MM-DD)
提取关键在区分 15 位与 18 位的年份字段,并补全为四位年份(如 "92" → "1992" 或 "23" → "2023"):
- 用
exec()获取捕获组,例如:const match = idCard.match(/^(\d{6})(\d{4}|\d{2})(\d{2})(\d{2})\d{3}[\dxX]?$/); - 若匹配成功,
match[2]是年份部分(4 位或 2 位);match[3]是月份;match[4]是日期 - 对两位年份做智能补全:
— 若值在00–08,倾向归为 21 世纪(2000–2008);
— 若值在09–99,倾向归为 20 世纪(1909–1999);
— 更稳妥做法是结合当前年份动态判断(如:若parseInt(yy) + 2000 > new Date().getFullYear(),则用 1900 起始)
简单可靠的校验+提取函数示例
以下函数返回 { valid: boolean, birthDate: string | null }:
20${year}
注意事项与边界提醒
- 正则不能替代公安部校验码算法(ISO 7064:1983 MOD 11-2),18 位身份证末位需单独计算验证
- 15 位身份证已停发多年,生产环境建议优先提示用户升级为 18 位
- 月份/日期可能为 "00"(极少数旧证),需在业务层决定是否接受
- 前端校验仅为用户体验优化,后端必须重新校验,不可信任前端输入
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











