身份证号码的正则表达式及验证详解图(身份证号码的正则表达式及验证详解图片)

作者:电脑培训网 2024-05-06 21:27:28 909

正则表达式详解及身份证号验证

身份证号码的正则表达式及验证详解(JavaScript,Regex)

简介

身份证号码的正则表达式及验证详解图(身份证号码的正则表达式及验证详解图片)

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

身份证号码说明

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

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

身份证号码含义解析

注:该ID号来自国家标准[GB11643-1999]。

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

方案1

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]/。

方案1完整代码

根据以上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

在方案一的缺点基础上,引入方案二,改进方案一的缺点。

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'));

方案2完整代码

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个相关介绍培训学校代码怎么查的解答,让我们一起看看吧。如何查询教…

    培训学校代码怎么查,培训学校代码怎么查询 2024-08-21 16:18:10
  • 太原志成培训学校学校代码,太原志成培训学校学校代码是多少

    太原志成培训学校学校代码,太原志成培训学校学校代码是多少

    大家好,今天小编关注到一个比较有意思的话题,就是关于太原志成培训学校学校代码的问题,于是小编就整理了1个相关介绍太原志成培训学校学校代码的解答,让我们一起看看吧…

    太原志成培训学校学校代码,太原志成培训学校学校代码是多少 2024-06-15 12:58:23
  • 无锡代码培训学校,无锡哪里有编程培训班

    无锡代码培训学校,无锡哪里有编程培训班

    大家好,今天小编关注到一个比较有意思的话题,就是关于无锡代码培训学校的问题,于是小编就整理了2个相关介绍无锡代码培训学校的解答,让我们一起看看吧。2273是哪个…

    无锡代码培训学校,无锡哪里有编程培训班 2024-06-03 20:02:33
  • 开源项目下载(开源项目committer)

    开源项目下载(开源项目committer)

    开源项目ChatGPT-网站再次更新,累计下载量1600+,使用量个人简介作者简介:大家好,我是全栈领域的优质创作者Aniu。个人主页:楼主阿牛支持我:点赞+收…

    开源项目下载(开源项目committer) 2024-05-07 09:21:23
  • vue3没有data了吗(vue3没有this)

    vue3没有data了吗(vue3没有this)

    Vue3无代码提示问题如何解决?在之前的笔记中,我提到过在为Vue3+vite+Ts编写代码的过程中,出现了代码自动补全失败功能。今天我就来说说如何解决这个问题…

    vue3没有data了吗(vue3没有this) 2024-05-05 14:08:19