身份证校验

const RegexUtils = {
  /**
   * 中文验证
   */
  checkCN(text: string): boolean {
    if (text) {
      let regex = /^[\u4E00-\u9FA5]+$/;
      return regex.test(text.trim());
    } else {
      return false;
    }
  },

  /**
   * 手机号码格式验证
   */
  checkMobile(mobile: string): boolean {
    if (mobile) {
      let regex = /^1[3-9]\d{9}$/;
      return regex.test(mobile.trim());
    } else {
      return false;
    }
  },

  /**
   * 邮箱格式验证
   */
  checkEmail(email: string): boolean {
    let result: boolean;
    if (email) {
      let regex =
        /^([a-zA-Z0-9]+[_|.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/;
      result = regex.test(email.trim());
    } else {
      result = false;
    }
    return result;
  },

  /**
   * 字母+数字
   */
  checkLetterAndNumber(value: string) {
    if (value) {
      let regex = /^[a-zA-Z0-9]+$/;
      return regex.test(value.trim());
    } else {
      return false;
    }
  },

  checkBank(value: string) {
    if (value) {
      let regex = /^[0-9]+$/;
      return regex.test(value.trim());
    } else {
      return false;
    }
  },

  isLeapYear(year: number): boolean {
    if (isNaN(year)) {
      // 非数字
      return false;
    } else {
      return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
    }
  },

  /**
   * 身份证号码格式验证
   */
  checkIdCard(idCardNum: string): boolean {
    let prov = {
      11: '北京',
      12: '天津',
      13: '河北',
      14: '山西',
      15: '内蒙古',
      21: '辽宁',
      22: '吉林',
      23: '黑龙江',
      31: '上海',
      32: '江苏',
      33: '浙江',
      34: '安徽',
      35: '福建',
      36: '江西',
      37: '山东',
      41: '河南',
      42: '湖北',
      43: '湖南',
      44: '广东',
      45: '广西',
      46: '海南',
      50: '重庆',
      51: '四川',
      52: '贵州',
      53: '云南',
      54: '西藏',
      61: '陕西',
      62: '甘肃',
      63: '青海',
      64: '宁夏',
      65: '新疆',
      71: '台湾',
      81: '香港',
      82: '澳门',
      91: '国外',
    };
    if (!prov[parseInt(idCardNum.substr(0, 2))]) {
      // 省份检验
      return false;
    }
    let regExp;
    let idChars = idCardNum.split('');
    switch (idCardNum.length) {
      case 15: // 15位身份证号检测
        if (this.isLeapYear(parseInt(idCardNum.substr(6, 2)) + 1900)) {
          // 闰年
          regExp =
            /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;
        } else {
          // 平年
          regExp =
            /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;
        }
        return regExp.test(idCardNum);
      case 18: // 18位身份号码检测
        if (this.isLeapYear(parseInt(idCardNum.substr(6, 4)))) {
          // 闰年
          regExp =
            /^[1-9][0-9]{5}[1-9][0-9]{3}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;
        } else {
          // 平年
          regExp =
            /^[1-9][0-9]{5}[1-9][0-9]{3}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;
        }
        if (regExp.test(idCardNum)) {
          // 基本校验
          let modulus,
            checkCodeList = '10X98765432';
          let sum, code;
          sum =
            (parseInt(idChars[0]) + parseInt(idChars[10])) * 7 +
            (parseInt(idChars[1]) + parseInt(idChars[11])) * 9 +
            (parseInt(idChars[2]) + parseInt(idChars[12])) * 10 +
            (parseInt(idChars[3]) + parseInt(idChars[13])) * 5 +
            (parseInt(idChars[4]) + parseInt(idChars[14])) * 8 +
            (parseInt(idChars[5]) + parseInt(idChars[15])) * 4 +
            (parseInt(idChars[6]) + parseInt(idChars[16])) * 2 +
            parseInt(idChars[7]) +
            parseInt(idChars[8]) * 6 +
            parseInt(idChars[9]) * 3; // 计算校验位
          modulus = sum % 11;
          code = checkCodeList.substr(modulus, 1); // 找到校验位
          return code == idChars[17];
        } else {
          return false;
        }
      default:
        return false;
    }
  },

  /**
   * 金额格式验证:不能为负数,保留两位小数
   */
  checkAmount(amount: string): boolean {
    if (amount) {
      const regex =
        /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0)$)|(^[0-9]\.[0-9]([0-9])?$)/;
      return regex.test(amount.trim());
    } else {
      return false;
    }
  },

  //校验数字加字母
  checkNumberAndLetter(str: string): boolean {
    const re = /^[0-9a-zA-Z]*$/; //判断字符串是否为数字和字母组合
    if (!re.test(str)) {
      return false;
    } else {
      return true;
    }
  },

  // 一种类型的密码
  oneTypePwdRegex:
    /(?!^[0-9]{8,20}$)(?!^[a-z]{8,20}$)(?!^[A-Z]{8,20}$)^[0-9A-Za-z\!\@\#\$\%\^\&\*\(\)\_\-\+\=]{8,20}$/g,
  // 两种类型的密码
  twoTypePwdRegex:
    /(?!^[0-9a-zA-Z]{8,20}$)^[0-9A-Za-z\!\@\#\$\%\^\&\*\(\)\_\-\+\=]{8,20}$/g,
};

export default RegexUtils;
posted @ 2022-01-14 18:44  未几  阅读(92)  评论(0编辑  收藏  举报