
本文由Script House收集并编辑,主要介绍了与居民ID卡匹配的正则表达式. Script House编辑认为这非常好. 现在,我将与您分享并提供参考.
大陆居民的有两种类型: 18位和15位数字. 15位ID号是上一代的ID号.
18位数字和15位数字之间的区别分为两个部分: 首先,将18位数字的年份计为4位数字,而将15位数字的年份计为2位数字,如1987年,则18位为'1987'. 数字. 15位数字为“ 87”. 1987年只是一个例子. 1987年或以后可能没有15位数字;第二个区别是18位数字的最后一位是数字校验码,而15位数字不是. 数字校验位.
好的,也许您仍然不知道ID号的每个部分代表什么,所以让我简要介绍一下.
ID卡号从左到右共有4个部分(15位数字只有3个部分): 第一部分有6位数字,这是ID卡的地址代码(什么是地址代码)办理时居民户口所在地自行前往统计局正则表达式18位,地址如下: );第二部分有8位数字(15位是6位数字),这是居民的出生日期;第三部分有3位数字,即数字顺序码,与前一天出生的人的顺序相同,奇数代表男性,偶数代表女性;第四部分和最后一部分有1位数字,这是一个数字校验码,这部分只有18位数字,如何计算数字校验码,将在后面详细介绍.
首先,假设有以下ID号: 35052519870101888X(如果是15位数字,则为350525870101888),然后使用“-”区分以下部分: 350525-19870101-888-X. 其中350525是地址码,是的,向统计局查询的结果是'福建省永春县-桃园胜景,算了,废话. 19870101是出生日期,呵呵,1987年1月1日,一天中出生的人必须滴眼液; 888是序列号. 估计不应该有1987年1月1日出生的第888人. 如果有的话,那真的不是一个人,而是一个上帝! !哈哈,据估计,我们党不会将此号码交给上帝. 我不会再说了. 我会说这可能使人与神一起发怒……嗯,什么是X?为什么有些人的号码的最后一位突然出现X?这些人特别吗?答案是: 不正则表达式18位,没关系,如果有一个等于10的数字,这些人不必在ID号的最后一位加一个X,这是怎么回事,请听我说吧^ _ ^
18位号的最后一位数字-数字验证码的计算方法:

1. 将ID号的前17位数字乘以以下系数: 7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2;
2. 将通过上述乘积获得的结果相加;
3. 将上述加法结果除以11得到余数;
4. 上面获得的余数可能是0到10之间的11个数字之一. 10是替代选择,因为我们的数字校验位只有1位,显然需要替换方案,用1位替换10,因此X派上用场了. 请注意,数字校验位不是余数! !结果是11个余数:
数字校验数字0、1、2、3、4、5、6、7、8、9、10是:
1、0,X,9、8、7、6、5、4、3、2
PS: 通过以上计算,现在应该很清楚了. ID号码的最后一位是X,因为在验证过程中获得的余数是2,显然这些号码没有什么特别的. 应该强调的是,X不是英文字母,而是罗马数字X. 请记住,它不是字母而是数字,但是,嘿,我们通常使用英文大写字母X来表示罗马数字X,囧nz ...

让我花一点时间验证上面的号: 35052519870101888X是否正确,首先声明如果确认可以使用,请勿将其用作书,并且我不承担任何责任. 它!
1. 前17位数字乘以相应的系数: 3 * 7 + 5 * 9 + 0 * 10 + 5 * 5 + 2 * 8 + 5 * 4 + 1 * 2 + 9 * 1 + 8 * 6 + 7 * 3 + 0 * 7 + 1 * 9 + 0 * 10 + 1 * 5 + 8 * 8 + 8 * 4 + 8 * 2 = 333(如果没错^ _ ^)
2. 将以上获得的结果333除以11得到余数: 3
3. 哈哈35052519870101888X这个号码不是有效的ID号,有效号码应该是350525198701018889
好吧,在了解了居民ID号码各部分的含义之后,我们终于可以找到一种验证号码的方法.
假设我们的系统不知道输入号码的人的任何信息(如果系统还要求出生地和出生日期,则可以进一步验证真实性^ _ ^)
首先,地址代码的前2位数字是省号. 进入统计局,发现第一位不是0,当前范围是1-9. 9是是0-7. 统计局通常每年发布一次更新的地址代码,但是与这些年来的地址代码相比,可以看到地址代码基本上没有变化(如果更改,现有的ID号不会无用^ _ ^ ). 我们地址代码的正则表达式可以这样写: / ^ [1-9] [0-7] \ d {4} /,实际上,如果您要编写一个准确的表达式,这还不够准确. 当前地址代码公式,应这样写: / ^((1 [1-5])|(2 [1-3])|(3 [1-7])|(4 [1-6]) |(5 [0-4])|(6 [1-5])| 71 |(8 [12])| 91)\ d {4} /,这显然更准确,但表达式要长得多,当然,要找到确切的表达方式也可以更长一些,但如果统计局修改了省地址代码,则应根据实际情况对表达方式稍作修改. 幸运的是,省地址代码不应更改,呵呵,所以选择哪个表达式公式都可以,我在这里不会写那个长表达式,所以选择/ ^ [1-9] [0-7] \ d { 4} /.

下一个是日期,呵呵,看来我之前写的日期匹配可以用作参考. 当时的表达式如下:
/ ^(((((19 | 20)\ d {2})-(0?[13-9] | 1 [012])-(0?[1-9] | [12] \ d | 30))|((((19 | 20)\ d {2})-(0?[13578] | 1 [02])-31)|((((19 | 20)\ d {2})-0? 2-(0?[1-9] | 1 \ d | 2 [0-8]))|(((((((19 | 20)([13579] [26] | [2468] [048] | 0 [48 ]))|((2000))-0?2-29))$ /
此表达式可以匹配1900-2099年的日期,还支持also年.
我们的表达方式不需要太长时间匹配,就足以匹配二十世纪了,什么,您不知道二十世纪吗? 1900-1999应该始终知道^ _ ^为什么足够匹配此范围?让我们检查居民的历史. 我敢于发行1900-1999年的保证金. 范围太大. 至于21世纪的新生代,呵呵,即使他出生于2000年,他目前9岁(有些算法是8岁,很尴尬),这些人的数目也应该印在户口书中,把它拿出来不会有多大作用. 此外,二十一世纪的人们不会理会我现在正在写的比赛^ _ ^
好吧,废话太多,让我们开始匹配日期. 略微修改了上面的表达式:
/(((19 \ d {2}(0 [13-9] | 1 [012]](0 [1-9] | [12] \ d | 30))|(19 \ d {2} (0 [13578] | 1 [02])31)|(19 \ d {2} 02(0 [1-9] | 1 \ d | 2 [0-8]))|(19([13579] [ 26] | [2468] [048] | 0 [48])0229))/
正则表达式没有计算验证的能力,因此对于序列代码,除了基本匹配之外,我们无法执行其他任何操作,因此序列代码的表达式为: / \ d {3} /

最后一位验证码-/(\ d | X | x)?$ /. 原因是最后一位数字可能是数字或X,但是有些人可能习惯于将X写为小写x,我们必须认为是正确的,最后一位呢?与15位数字兼容,仅此时,您需要用4位数字表示15位数字的年份,以与下面的集成表达式匹配-
/ ^ [1-9] [0-7] \ d {4}((19 \ d {2}(0 [13-9] | 1 [012])(0 [1-9] | [ 12] \ d | 30))|(19 \ d {2}(0 [13578] | 1 [02])31)|(19 \ d {2} 02(0 [1-9] | 1 \ d | 2 [0-8]))|(19([13579] [26] | [2468] [048] | 0 [48])0229))\ d {3}(\ d | X | x)?$ /
精确地址代码表达式:
/ ^((1 [1-5])|(2 [1-3])|(3 [1-7])|(4 [1-6])|(5 [0-4]) |(6 [1-5])| 71 |(8 [12])| 91)\ d {4}((19 \ d {2}(0 [13-9] | 1 [012])(0 [ 1-9] | [12] \ d | 30))|(19 \ d {2}(0 [13578] | 1 [02])31)|(19 \ d {2} 02(0 [1-9 ] | 1 \ d | 2 [0-8]))|(19([13579] [26] | [2468] [048] | 0 [48])0229))\ d {3}(\ d | X | x)?$ /
关于数字验证,上面已经给出了算法,我在这里不再继续,这篇文章真的足够长,我不想继续,但是有可能当天重新打开该文章. ^ _ ^
发件人:
以上是Scripting House收集并编译的正则表达式,可让您匹配居民的全部内容. 希望本文能帮助您解决正则表达式匹配居民所遇到的程序开发问题.
如果您认为Script House网站的内容不错,欢迎向您的程序员朋友推荐Script House网站.
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-278352-1.html
当老师的说的都是美好的