如何使用JavaScript + Regex实现身份证号码的正则表达式及验证

  

这篇文章主要介绍如何使用JavaScript+Regex实现身份证号码的正则表达式及验证,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

身份证号码说明

居民身份证号码,正确、正式的称谓应该是“公民身份号码”。根据【中华人民共和国国家标准 GB 11643-1999】中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

以北京市朝阳区一女性身份证号码为例,身份证号码所表示的含义如下图所示:

如何使用JavaScript+Regex实现身份证号码的正则表达式及验证

注:该身份证号码来源于国标【GB 11643-1999】。

下面我们就从零开始完成一个完整的身份证号码校验过程。

方案1 (简单)

1.1 分部规则

1.1.1 地址码规则:
地址码长6位
以数字1-9开头
后5位为0-9的数字

根据以上规则,写出地址码的正则表达式: /^[1-9]\d{5}/

1.1.2 年份码规则:
年份码长4位
以数字18,19或20开头
剩余两位为0-9的数字

根据以上规则,写出年份码的正则表达式:/(18|19|20)\d{2}/。如果不需要18开头的年份,可以去掉18。

1.1.3 月份码规则:
月份码长2位
第一位数字为0,第二位数字为1-9
或者第一位数字为1,第二位数字为0-2

根据以上规则,写出月份码的正则表达式: /((0[1-9])|(1[0-2]))/

1.1.4 日期码规则:
日期码长2位
第一位数字为0-2,第二位数字为1-9
或者是10,20,30,31

根据以上规则,写出日期码的正则表达式 :/(([0-2][1-9])|10|20|30|31)/

1.1.5 顺序码规则:
顺序码长3位
顺序码是数字

根据以上规则,写出顺序码的正则表达式 :/\d{3}/

1.1.6 校验码规则:
校验码长1位
可以是数字,字母x或字母X

根据以上规则,写出校验码的正则表达式 :/[0-9Xx]/

1.2 方案1正则表达式

综合以上6条规则,给出完整的正则表达式及测试程序如下:

var p = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;//输出,真的
  console.log(僵化(“11010519491231002 x"));//输出,false 不能以0开的头
  console.log(僵化(“01010519491231002 x"));//输出,false 年份不能以17开的头
  console.log(僵化(“11010517491231002 x"));//输出,false 月份不能为13
  console.log(僵化(“11010519491331002 x"));//输出,false 日期不能为32
  console.log(僵化(“11010519491232002 x"));//输出,false 不能以一个结尾
  console.log(僵化(“11010519491232002 a")); 

<强> 1.3方案1分析

方案1只是做了基本的格式判定,存在三个主要的不足:
地址码判定不够精确。例:我国并不存在16日,26日开头的地区,却可通过验证日期判定不够精确。例:19490231也可通过验证,而2月并不存在31日校验码是由17位本体码计算得出,方案1并未校验此码方案2(全面)
根据方案1的不足,引入方案2进而改进方案1的不足。

<>强省的2.1级地址码校验

华北:北京11天津12日河北13日山西14日内蒙古15
东北:辽宁21日吉林22日黑龙江23
华东:上海31日江32岁的苏浙江33岁的安徽34岁的福建35岁,江西36岁的山东37
华中:河南41岁,湖北42岁,湖南43
华南:广东44岁广西45岁的海南46
西南:四川51岁,贵州52岁的云南53岁的西藏54岁,重50
西庆北:陕西61年甘肃62年,青海63年,宁64年夏,新疆65
特别:台湾71年,香港81年,澳门82

根据上述地址码做身份证号码的前两位校验,进一步的提高准确率。当前的地址码以2013版的行政区划代码【GB/T2260】为标准。由于区划代码的历史演变,使得地址码后四位校验变得不太可能。以三胖的身份证号为例,本人号码是2321年开的头,而当前行政区划代码表中并无此代码,因此本文只做前两位省级地址码的校验。

也有说法表述91开头是外国人取得中国身份证号码的前两位编码,但本人并未得到证实。如有持91开头身份证或认识马布里的,请帮忙确认相关信息。

如何使用JavaScript + Regex实现身份证号码的正则表达式及验证