身份证号码正则表达式详解

1、结构:

公民身份号码是特征组合码,由十七位数字本体码和一校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

地址码身份证号码第一位到第六位表示编码对象常住户口所在行政区划代码,按GB/T2260的规定执行

华北地区:北京市|110000,天津市|120000,河北省|130000,山西省|140000,内蒙古自治区|150000

东北地区: 辽宁省|210000,吉林省|220000,黑龙江省|230000

华东地区: 上海市|310000,江苏省|320000,浙江省|330000,安徽省|340000,福建省|350000,江西省|360000,山东省|370000

华中地区: 河南省|410000,湖北省|420000,湖南省|430000

华南地区:广东省|440000,广西壮族自治区|450000,海南省|460000

西南地区:重庆市|500000,四川省|510000,贵州省|520000,云南省|530000,西藏自治区|540000

西北地区: 陕西省|610000,甘肃省|620000,青海省|630000,宁夏回族自治区|640000,新疆维吾尔自治区|650000

港澳地区:香港特别行政区|810000,澳门特别行政区|820000

台湾地区:台湾省|830000

2019年12月中华人民共和国县以上行政区划代码

中国大陆居民身份证号码中的地址码的数字编码规则为:

第一、二位表示省级行政区。

第一位数字是以前的大区制代码。第二位是大区所在省市编码。全国共分为8个大区:华北(1)、东北(2)、华东(3)、华南(4)、西南(5)、西北(6)、台湾(7)和港澳(8)。

第三、四位表示地级行政区。其中,01-20,51-70表示地级市;21-50表示地区、自治州、盟;90表示省直辖县级行政单位;直辖市身份证中01表示市辖区,02表示县。

第五、六位表示县级行政区。01-18表示市辖区或地区、自治州、盟辖县级市;21-80表示县、旗;81-99表示省直辖县级行政单位。

出生日期码身份证号码第七位到第十四位)表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。例如:1981年05月11日就用19810511表示。按GB/T7408的规定执行。

顺序码身份证号码第十五位到第十七位)表示在同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。其中第十七位奇数分给男性,偶数分给女性。

校验码身份证号码第十八位)根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。

计算方法

1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。

2、将这17位数字和系数相乘的结果相加。

3、用加出来和除以11,看余数是多少。

4、余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。(即余数0对应1,余数1对应0,余数2对应X...)

5、通过上面得知如果余数是3,就会在身份证的第18位数字上出现的是9。如果对应的数字是2,身份证的最后一位号码就是罗马数字X。

例如:某男性的身份证号码为【53010219200508011X】, 我们看看这个身份证是不是符合计算规则的身份证。

首先我们得出前17位的乘积和【5×7+3×9+0×10+1×5+0×8+2×4+1×2+9×1+2×6+0×3+0×7+5×9+0×10+8×5+0×8+1×4+1×2】是189,然后用189除以11得出的结果是189÷11=17余下2,也就是说其余数是2。最后通过对应规则就可以知道余数2对应的检验码是X。所以,可以判定这是一个正确的身份证号码。

2、匹配规则

地址码规则: 地址码长6位可简单描述为以数字1-9开头后5位为0-9的数字根据以上规则,写出地址码的正则表达式:

 /^[1-9]\d{5}/

复杂点可全部覆盖现有规定的地址:

/((1[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|[7-9]1)\d{4}/

②出生日期码规则

年份长4位 以数字192021开头 剩余两位为0-9的数字 根据以上规则,写出年份码的正则表达式:

/(19|20|21)\d{2}/

月份长2位 第一位数字为0,第二位数字为1-9 或者第一位数字为1,第二位数字为0-2 根据以上规则,写出月份码的正则表达式:

/((0[1-9])|(1[0-2]))/

日期长2位 第一位数字为0-2,第二位数字为1-9 或者是10,20,30,31 根据以上规则,写出日期码的正则表达式 :

/(([0-2][1-9])|10|20|30|31)/

顺序码规则顺序码长3位顺序码是数字根据以上规则,写出顺序码的正则表达式 :

/\d{3}/

④校验码规则:校验码长1位,可以是数字,字母x或字母X。根据以上规则,写出校验码的正则表达式 :

/[0-9Xx]/

3、最终结果:

/^[1-9]\d{5}(19|20|21)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;

或者是:

/^((1[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|[7-9]1)\d{4}(19|20|21)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;

4、Java实现

private static boolean identityFormatCheck(String identityNum) {
    Pattern pattern = Pattern.compile(identityRegix );
    Matcher matcher = pattern.matcher(identityNum);
    return matcher.matches();
}

private static final String identityRegix = "^((1[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|[7-9]1)\d{4}(19|20|21)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$";

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值