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位 以数字19,20或21开头 剩余两位为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]$";