宝哥软件园

正则表达式和JavaScript正则表达式标识号的验证

编辑:宝哥软件园 来源:互联网 时间:2021-09-01

简短声明

在验证用户的真实姓名时,经常会用到身份证号码的正则表达式和验证方案。本文列举了两种验证方案,大家可以根据自己项目的实际情况选择合适的方案。

idcard-check

身份证号码描述

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

以北京朝阳区一位女士的身份证号码为例。身份证号码的含义如下图所示:

身份证号码含义解析

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

接下来,我们将从头开始完成一个完整的身份证号码验证过程。

选项1(简单)

1.1划分规则

1.1.1地址码规则:地址码长6位,后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月码规则:月码长度第一位为0,第二位为1-9或第一位为1,第二位为0-2

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

1.1.4日期编码规则:日期编码的第一位数字为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校验码规则:校验码长度的一位可以是数字、字母x或字母x。

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

1.2方案1正则表达式

基于以上六条规则,完整的正则表达式和测试程序如下:

风险值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]$/;//输出true console . log(p . test(' 11010519491231002 x ');//输出false console . log(p . test(' 01010519491231002 x ');//输出console . log(p . test(' 11010517491231002 x ')),在false year中不能以17开头;//输出的假月份不能是13 console . log(p . test(' 11010519491331002 x ');//输出的假日期不能是32 console . log(p . test(' 11010519491232002 x ');//output false不能以console.log结尾(p . test(' 11010519491232002 a ');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

根据地址码,对身份证号码的前两位进行验证,进一步提高了准确性。现行地址码以2013版行政区划代码[GB/T2260]为基础。由于分区代码的历史演变,无法检查地址码的最后四位数字。以三胖的身份证号为例。我的身份证号以2321开头,但目前的行政区划代码表中没有这样的代码。因此,本文仅对前两个省地址码进行验证。

还有一种说法,91开头是外国人获得的中国身份证号码的前两个代码,但我没有得到确认。如果你有91开头的身份证或者认识马布里,请帮忙确认相关信息。根据以上分析,省地址码的验证和测试程序如下:

var check prov=function(val){ var pattern=/^[1-9][0-9]/;Var provs={11: '北京',12: '天津',1: '河北',14: '山西',15: '内蒙古',213360 '辽宁',22: '吉林',2333366 34: '安徽',353: '福建',363: '江西',37: '山东',41:} }返回false}//输出true,37是山东console . log(CheckProv(37));//输出false,16 console.log(checkProv(16存在)(CheckProv(16));2.2出生日期代码验证

出生日期代码的验证没有说明,直接给出了以下功能和测试程序:

var check date=function(val){ var pattern=/^(18|19|20)d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)$/;if(pattern . test(val)){ var year=val . substring(0,4);var month=val.substring(4,6);var date=val.substring(6,8);var date2=新日期(年'-'月'-'日);if(date 2 date 2 . getmonth()==(parsent(month)-1)){ return true;} }返回false}//输出true console . log(check date(' 20180212 ');//输出false:2月31日没有console.log(检查日期(' 20180231 ');2.3校验码检查

校验码的计算有点复杂,先给出以下公式:

其中ai代表身份证体码的第I位值,Wi代表第I位加权因子值。

加权因子表[表1]:

I 1 2 3 4 5 6 7 8 WI 7 9 10 5 8 2 1 9 10 11 12 13 14 15 16 17 6 3 7 9 10 5 8 4 2 X和校验码转换表[表2]

X 0 1 2 3 4 5 6 7 8 9 10 a18 1 0 X 9 8 7 6 5 4 3 2算法过程:

根据身份证主体码(前17位数字)和对应的加权因子(表1),再次计算乘积并求和,将得到的结果和11进行模运算得到x值。根据x值查表2,得到a18作为校验码值。检查代码计算程序并测试参见以下代码:

var check code=function(val){ 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]$/;var因子=[ 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 code=val . substring(17);if(p . test(val)){ var sum=0;for(var I=0;i17I){ sum=val[I]* factor[I];} if(奇偶性[sum % 11]==code . touppercase()){ return true;} }返回false}//输出true,校验码匹配console . log(check code(' 11010519491231002 x ');//输出false,校验码与console.log不匹配(校验码(' 110105194912310021 ');2.4方案2总体编码

var CheckID=function(val){ if(CheckCode(val)){ var date=val。子串(6,14);if(check date(date)){ if(check prov(val。子字符串(0,2))} { 0返回true} } }返回false}//输出真正的控制台。日志(CheckID(' 11010519491231002 X ');//输出假的,校验码不符控制台。日志(CheckID(' 110105194912310021 ');//输出假的,日期码不符控制台。日志(CheckID(' 110105194902310026 ');//输出假的,地区码不符控制台。日志(CheckID(' 160105194912310029 ');以上为三胖对身份证号码验证的理解和分析,如有不足请大家予以指正。

更多资讯
游戏推荐
更多+