js身份证号校验,正则表达式为何校验15位和18位?

公民身份证号码按照 GB11643—1999《公民身份证号码》国家标准编制。

由18位数字组成:前6位为行政区划分代码,第7位至14位为出生日期码,第15位至17位为顺序码,第18位为校验码。

在上世纪(二十世纪)办的身份证为15位数字码。原来7、8位的年份号到2000年后攺为全称,如1985年过去7、8位码是85,现在增改为1985,而又在最后一位增加校验码,如后三位原来601,加一个5成为6015。

身份证一经编定不作改变,派出所会在户口资料中给你加上,你要换新证时就是18位的新码了。

第一代身份证都是15位的
  • 其中从左至右前六位是反映地址的,如同一个县区镇的人员,前六位是一致的

  • 从第七位数至12位数是反映个人出生日期的.7、8两位数是年(如1979年出处的,出生年只取后两位即79),9、10两位是月、11、12两位数是日。

  • 最后三位是顺序码,即在同一地同年同日生人作区分的,其中最后一位是偶数的分配给女性(即最后一位是偶数号的一定是女性,奇数的一定是男性)

第二代身份证是18位的
  • 其中前六位与15位码一样

  • 第六到14位是出生日期,从第七位数至12位数是反映个人出生日期的.7至10位数是年(如1979年出处的,出生年只取1979,这样避免无法区分2000后或2000年前出生的区别,再按15位码,01年出生就不能区分是1901年出生还是2001年出生的,毕竟100岁以上老人还是有的),11、12两位数是月、13、14两位数是日。

  • 最后四位是顺序码,即在同一地同年同日生人作区分的,其中第十七位是偶数的分配给女性(即最后一位是偶数号的一定是女性,奇数的一定是男性,最后一位是较验值,是按前17位编码按一定规则加权计算出来的,如是0-9,就取数字,是10就取X)

所以在凡有电脑录入身份证号的,身份证号只能是15位或18位数,不过随着一代身份证有效期的逐渐到期,很快所有人的身份证就会变为二代身证,号码会统一成十八位。不过一代号码在身份证系统中会自动链接到二代号的。

js写身份证号正则表达式规则

不严谨的写法(不校验区域编号是否合法以及出生年月日日是否合法):

  • 15位纯数字 或 17位纯数字 +(0~9或X/x)

var pattCardId = /(\d{15}$)|(\d{18}$)|(^\d{17}(\d|X|x)$)/;

  var pattCardId = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
  var editDriverCardId = function (item) {
                var pId = item.id;
                var dCard = item.driverCardId;
                if(!dCard){
                    return "
请填写有效证件号,必填项
"; }else{ if(pattCardId.test(dCard)){ vm.driverGridData[pId].driverCardId = dCard; return "
"+dCard+"
"; }else{ vm.driverGridData[pId].driverCardId = ""; return "
身份证格式非法
"; } } }

你可能感兴趣的:(js身份证号校验,正则表达式为何校验15位和18位?)