博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
身份证号码的正则校验+升级版
阅读量:6363 次
发布时间:2019-06-23

本文共 2399 字,大约阅读时间需要 7 分钟。

需求

验证一个身份证号码, 很简单的需求

本来想搜一个正则,结果发现,错误的太多了,只能自己试着写

网上的一个方法(垃圾,不要用)

function check (val) {    var reg = /[1-9]\d{14}|[1-9]\d{17}|[1-9]\d{16}x/  // 匹配14位或者17位或 16位数字后面加个x的    return reg.test(val)}

解读正则

[1-9]\d{14} 匹配14位数字

[1-9]\d{17} 匹配17位数字
[1-9]\d{16}x 匹配16位数字后面跟x

console.log(check('1111111111111111111111')) // true 这种鬼玩意都能匹配上

自己写一个简单的

在写之前先研究下身份证的结构,这里只研究18位的,因为15位的已经过期了!

分析

xxxxxx yyyy mm ddd nnn v 十八位

xxxxxx地区: [1-9]\d{5}

年的前两位: (18|19|20)
年的后两位: \d{2}
月份: ((0[1-9])|(10|11|12))
天数: (([0-2][1-9])|10|20|30|31)
顺序码: \d{3}
验证码: [0-9Xx]

正则表达: ^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$

function check (val) {    var reg = /[1-9]\d{14}|[1-9]\d{17}|[1-9]\d{16}x/  // 匹配14位或者17位或 16位数字后面加个x的    return reg.test(val)}console.log(check('610102218801012344')) //年不对 false  610102  2188  01 01 234 4 console.log(check('610102198801012344')) //true               610102  1988  01 01 234 4

升级版验证

身份证的前6位代表地区

对应表

校验码的计算方法

某男性的身份证号码是340523198001010013。我们要看看这个身份证是不是合法的身份证。

1.17位分别乘不同系数 let arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]结果相加

  1. 加出来除以11,看余数
  2. 余数对应数组let arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']的位置的值

举个例子

首先我们得出前17位的乘积和:(3*7+4*9+0*10+5*5+2*8+3*4+1*2+9*1+8*6+0*3+0*7+1*9+0*10+1*5+0*8+0*4+1*2) = 185然后再求余:185 % 11 = 9最后通过对应规则就可以知道余数9对应的数字是3。所以,可以判定这是一个合格的身份证号码。
function check(val) {  const city = { '110000': '北京市',    '110100': '北京市市辖区',    '110101': '北京市东城区',    '110102': '北京市西城区'........ }  // 对应的地区码 上面有,数据太多这里省略  // 类型转换  let id = parseInt(val, 10)  // 正则判断基本类型  if (!/^\d{17}(\d|x)$/i.test(id)) return false  // 地区的判断  if (city[id.substr(0, 6)] === undefined) return false  // 生日  let birthday = id.substr(6, 4) + '/' + Number(id.substr(10, 2)) + '/' + Number(id.substr(12, 2))  let d = new Date(birthday)  let newBirthday = d.getFullYear() + '/' + Number(d.getMonth() + 1) + '/' + Number(d.getDate())  let currentTime = new Date().getTime()  let time = d.getTime()  if (time >= currentTime || birthday !== newBirthday) return false  // 判断校验码  let arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]  let arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']  let sum = 0  for (let i = 0; i < 17; i++) {    sum += id.substr(i, 1) * arrInt[i]  }  let residue = arrCh[sum % 11]  if (residue !== id.substr(17, 1)) return false  return true }

转载于:https://www.cnblogs.com/mayufo/p/8304929.html

你可能感兴趣的文章
【.Net Framework 体积大?】不安装.net framework 也能运行!?开篇叙述-1
查看>>
LLDP协议、STP协议 笔记
查看>>
如何使用 GroupBy 计数-Count()
查看>>
有了这个课件制作工具,还怕备课有难题?
查看>>
jquery之clone()方法详解
查看>>
Delphi 用文件流读取文本文件字符串的方法
查看>>
php中怎么导入自己写的类
查看>>
C# 委托
查看>>
Using Information Fragments to Answer the Questions Developers Ask
查看>>
JVM学习(4)——全面总结Java的GC算法和回收机制---转载自http://www.cnblogs.com/kubixuesheng/p/5208647.html...
查看>>
getParameter和getAttribute的区别
查看>>
自动工作负载库理论与操作(Automatic Workload Repository,AWR)
查看>>
Redis两种方式实现限流
查看>>
CentOS 7 中使用NTP进行时间同步
查看>>
在MongoDB数据库中查询数据(上)
查看>>
Python import其他文件夹的文件
查看>>
Jvm(22),回收策略-----标记清除算法
查看>>
MySQL多表关联查询效率高点还是多次单表查询效率高,为什么?
查看>>
UNIX 高手的 10 个习惯
查看>>
传值与传引用
查看>>