正则表达式详解及身份证号验证
简介
在做用户实名验证时,经常会用到身份证号的正则表达式和验证方案。本文列出了两种验证方案。您可以根据项目的实际情况选择合适的方案。
身份证号码说明
居民身份证号码的正确、正式名称应为“公民身份证号码”。根据《中华人民共和国国家标准GB11643-1999》中关于公民身份号码的规定,公民身份号码是特征组合码,由十七位主体码和一位校验码组成。从左到右的顺序是:六位地址码、八位出生日期代码、三位序列码和一位位校验码。
以北京市朝阳区一位女士的身份证号为例,身份证号的含义如下图所示:
身份证号码含义解析
注:该ID号来自国家标准[GB11643-1999]。
接下来我们将从头开始完成一个完整的身份证号验证流程。
1.1划分规则
我们首先提出方案1并逐步定义以下规则:
1.1.1地址码规则:
地址码长度为6位
从数字1-9开始
最后5位数字是数字0-9
根据上述规则,写出地址码的正则表达式:/1\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或字母
根据上述规则,写出校验码的正则表达式:/[0-9Xx]/。
根据以上6条规则,给出完整的身份证号验证正则表达式代码如下:
varp=/^[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]$/;//输出trueconsole.log(p.test('11010519491231002X'));//输出false不能以0开头console.log(p.test('01010519491231002X'));//输出false年份不能以17开头console.log(p.test('11010517491231002X'));//输出false月份canbe13console.log(p.test('11010519491331002X'));//输出false,日期不能为32console.log(p.test('11010519491232002X'));//输出false,不能以控制台结束。日志(p.test('11010519491232002a'));
1.3方案1分析
方案一仅进行基本的格式判断,主要存在三个缺点:
地址码确定不够准确。例:我国没有16、26开头的地区,但可以通过验证。
日期确定不够精确。示例:19490231也可以验证,但是2月31日不存在
校验码是根据17位本体码计算得出的。方案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开头的身份证或者认识马布里,请帮忙确认相关信息。
根据以上分析,省级地址码验证测试流程如下:
varcheckProv=function(val){varpattern=/^[1-9][0-9]/;varprovers={11:'beijing',12:'Sianjin',133:'hebei',143:'shanxi',153:'innerMongolia',213:'liaoning'32:'江苏',33:'浙江',34:'安徽',35:'福建',36:'江西',37:'山东',41:'河南',42:'湖北',43:'湖南',44:'广东',45:'广西',46:'海南',50:'重庆',51:'四川',52:'贵州',53:'云南',54:'西藏',61:'陕西',62:'甘肃',6333360'青海',64:'宁夏',65:'新疆',71:'台湾',81:'香港',82:'澳门'};if(pattern.test(val)){if(provs[val]){returntrue;}}}returnfalse;}//输出true,37是山东console.log(checkProv(37));//输出false,16不存在console.log(checkProv(16));
2.2出生日期代码验证
对于出生日期代码的验证没有任何解释。直接给出以下功能和测试流程:
varcheckDate=function(val){varpattern=/^(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)$/;if(pattern.test(val)){varyear=val.substring(0,4);var月份=val.substring(4,6);var日期=val.substring(6,8);vardate2=newDate(年+'-'+月+'-'+日期);if(date2date2.getMonth()==(parseInt(month)-1)){returntrue;}}}returnfalse;}//输出trueconsole.log(checkDate('20180212'));//输出false二月没有31天console.log(checkDate('20180231'));
2.3校验码验证
校验码的计算稍微复杂一些。首先给出如下公式:
检查代码公式
其中ai表示身份证本体码的第i位值,Wi表示第i位权重因子值。
权重因子表【表1】:
我12345678
无线791058421
91011121314151617
6379105842
X与校验码换算表【表2】
X012345678910
a1810X98765432
算法流程:
根据身份证主码和相应的权重因子计算乘积,然后求和。X值是通过将结果模11获得的。
根据X值查询表2,得到a18,即校验码值。
校验码计算程序及测试如下:
varcheckCode=function(val){varp=/^[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]$/;变量因子=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];var奇偶校验=[1,0,'X',9,8,7,6,5,4,3,2];var代码=val.substring(17);if(p.test(val)){varsum=0;for(vari=0;i17;i++){sum+=val[i]*factor[i];}if(parity[sum]==code.toUpperCase()){returntrue;}}returnfalse;}//输出true,检查码匹配console.log(checkCode('11010519491231002X'));//输出false,检查码不匹配console.log(checkCode('110105194912310021'));
varcheckID=function(val){if(checkCode(val)){vardate=val.substring(6,14);if(checkDate(date)){if(checkProv(val.substring(0,2))){返回true;}}}returnfalse;}//输出trueconsole.log(checkID('11010519491231002X'));//输出false,检查码不匹配console.log(checkID('110105194912310021'));//输出false,日期代码不匹配console.log(checkID('110105194902310026'));//输出false,区号不匹配console.log(checkID('160105194912310029'));
以上就是对身份证号验证的理解和分析。如有不足之处,请大家指正。
以上
完,祝你成功。
1-9
大家好,今天小编关注到一个比较有意思的话题,就是关于培训学校代码怎么查的问题,于是小编就整理了3个相关介绍培训学校代码怎么查的解答,让我们一起看看吧。如何查询教…
大家好,今天小编关注到一个比较有意思的话题,就是关于太原志成培训学校学校代码的问题,于是小编就整理了1个相关介绍太原志成培训学校学校代码的解答,让我们一起看看吧…
大家好,今天小编关注到一个比较有意思的话题,就是关于无锡代码培训学校的问题,于是小编就整理了2个相关介绍无锡代码培训学校的解答,让我们一起看看吧。2273是哪个…
开源项目ChatGPT-网站再次更新,累计下载量1600+,使用量个人简介作者简介:大家好,我是全栈领域的优质创作者Aniu。个人主页:楼主阿牛支持我:点赞+收…
Vue3无代码提示问题如何解决?在之前的笔记中,我提到过在为Vue3+vite+Ts编写代码的过程中,出现了代码自动补全失败功能。今天我就来说说如何解决这个问题…
2024-10-30 14:15:08
2024-10-30 12:15:19
2024-10-30 10:27:09
2024-10-30 08:45:08
2024-10-30 06:40:09
大家好,今天小编关注到一个比较有意思的话题,就是关于学校重业务轻安全培训的问题,…
大家好,今天小编关注到一个比较有意思的话题,就是关于培训机构读书节活动的问题,于…