zoukankan      html  css  js  c++  java
  • JS 最新正确的身份证号码正则

    之前网上找了个身份证正则,一直用着挺好,直到客户提到 360732202009290611 这个身份证号报警
    开始我还不信,网上查这个号码是真的,以下正则替换解决问题

    export const checkIDCard = (value: string) => {
      var num = value.toUpperCase() || '';
      // 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X。
      var reg = /^(\d{18,18}|\d{15,15}|\d{17,17}X)$/;
      if (!reg.test(num)) {
        return false;
      }
      // 校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
      // 下面分别分析出生日期和校验位
      var len, re;
      len = num.length;
      if (len == 15) {
        re = new RegExp(
          /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/);
        var arrSplit = num.match(re) || [];
        // 检查生日日期是否正确
        var dtmBirth = new Date('19' + arrSplit[2] +
          '/' + arrSplit[3] + '/' + arrSplit[4]);
        var bGoodDay;
        bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) &&
          ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) &&
          (dtmBirth.getDate() == Number(arrSplit[4]));
        if (!bGoodDay) {
          return false;
        }
      }
      if (len == 18) {
        re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/);
        var arrSplit = num.match(re) || [];
        // 检查生日日期是否正确
        var dtmBirth = new Date(arrSplit[2] + "/" +
          arrSplit[3] + "/" + arrSplit[4]);
        var bGoodDay;
        bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) &&
          ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) &&
          (dtmBirth.getDate() == Number(arrSplit[4]));
        if (!bGoodDay) {
          return false;
        } else {
          // 检验18位身份证的校验码是否正确。
          // 校验位按照ISO 7064:1983.MOD
          // 11-2的规定生成,X可以认为是数字10。
          var valnum;
          var arrInt = new Array(7, 9, 10, 5, 8, 4,
            2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
          var arrCh = new Array('1', '0', 'X', '9',
            '8', '7', '6', '5', '4', '3', '2');
          var nTemp = 0,
            i;
          for (var i: any = 0; i < 17; i++) {
            nTemp += num.substr(i, 1) * arrInt[i];
          }
          valnum = arrCh[nTemp % 11];
          if (valnum != num.substr(17, 1)) {
            return false;
          }
        }
      }
      return true;
    }
    

    .

  • 相关阅读:
    react路由组件&&非路由组件
    react函数式组件(非路由组件)实现路由跳转
    react使用antd组件递归实现左侧菜单导航树
    【LeetCode】65. Valid Number
    【LeetCode】66. Plus One (2 solutions)
    【LeetCode】68. Text Justification
    【LeetCode】69. Sqrt(x) (2 solutions)
    【LeetCode】72. Edit Distance
    【LeetCode】73. Set Matrix Zeroes (2 solutions)
    【LeetCode】76. Minimum Window Substring
  • 原文地址:https://www.cnblogs.com/xiangsj/p/15770375.html
Copyright © 2011-2022 走看看