正则校验各种基础表单验证规则

1.校验是否有特殊字符

const is = new RegExp("[`~!@#$^&*()=|{}':;%_'+\-,\\[\\].<>《》/?~!@#¥……&*()——|{}【】‘;:”“'。,、?]").test(value);

2.细节校验

// 是否为全部为中文字符
isCNValue(value: string): boolean {
 return new RegExp('^[\u4E00-\u9FA5]+$').test(value);
}
// 是否全部为英文字符
isENValue(value: string): boolean {
 return new RegExp('^[a-zA-Z/]+$').test(value);
}
// 是否包含特殊字符串(不包含数字)
isUnusualValue(value: string): boolean {
 return new RegExp("[`~!-@+#$^&*()=|{}':;',\\[\\].<>?~!@#¥……&*()——|{}【】‘;:”“'。,、?^0-9 ]").test(value);
}
//是否全是数字
isValueNumber(value:string):boolean{
 return new RegExp(/^\d{1,}$/).test(value);
}
//验证字符长度(中英文)以英文最长为准 中文对半
isLength(value:string,max:number):boolean{
  let l = 0;
  let a = value.split("");
  for (let i=0;i<a.length;i++) {
    //判断是中文还是英文  用Unicode码判断
    if (a[i].charCodeAt(0)<129) {
      //英文
      l++;
    } else {
      //中文
      l+=2;
    }
  }
 return  l<max;
}

 

3.身份证校验

idCard(value: string | null, type?: DocType): string {
 let v: string = type ? docMap[type] : '身份证';
 if (!value) return `请填写${v}号码`;
 let is: boolean = /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9Xx])$/.test(
  value
 );
 if(is){
     if(value.length==18){
       let idCardWi=[ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ]; //将前17位加权因子保存在数组里
       let idCardY=[1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]; //这是除以11后,可能产生的11位余数、验证码,也保存成数组
       let idCardWiSum=0; //用来保存前17位各自乖以加权因子后的总和
       for(let i=0;i<17;i++){
         idCardWiSum+=(parseInt(value.substring(i,i+1))*idCardWi[i]);
       }
       let idCardMod=idCardWiSum%11;//计算出校验码所在数组的位置
       let idCardLast=value.substring(17);//得到最后一位身份证号码
       //如果等于2,则说明校验码是10,身份证号码最后一位应该是X
       if(idCardMod==2){
         is  = (idCardLast==="X");
       }else{
         //用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码
         is =parseInt(idCardLast)===idCardY[idCardMod];
       }
     }
   }
 return is ? '' : `请正确填写${v}号码`;
}

4.银行卡校验

luhnCheck(bankno:string) {
   let lastNum = bankno.substr(bankno.length - 1, 1); //取出最后一位(与luhn进行比较)
   let first15Num = bankno.substr(0, bankno.length - 1); //前15或18位
   let newArr = [];
   for (let i = first15Num.length - 1; i > -1; i--) { //前15或18位倒序存进数组
     newArr.push(first15Num.substr(i, 1));
   }
   let arrJiShu = []; //奇数位*2的积 <9
   let arrJiShu2 = []; //奇数位*2的积 >9
   let arrOuShu = []; //偶数位数组
   for (let j = 0; j < newArr.length; j++) {
     if ((j + 1) % 2 === 1) { //奇数位
       if (parseInt(newArr[j]) * 2 < 9) arrJiShu.push(parseInt(newArr[j]) * 2);
       else arrJiShu2.push(parseInt(newArr[j]) * 2);
     } else //偶数位
       arrOuShu.push(newArr[j]);
   }
   let jishuChild1 = []; //奇数位*2 >9 的分割之后的数组个位数
   let jishuChild2 = []; //奇数位*2 >9 的分割之后的数组十位数
   for (let h = 0; h < arrJiShu2.length; h++) {
     jishuChild1.push(parseInt(arrJiShu2[h]) % 10);
     jishuChild2.push(parseInt(arrJiShu2[h]) / 10);
   }
   let sumJiShu = 0; //奇数位*2 < 9 的数组之和
   let sumOuShu = 0; //偶数位数组之和
   let sumJiShuChild1 = 0; //奇数位*2 >9 的分割之后的数组个位数之和
   let sumJiShuChild2 = 0; //奇数位*2 >9 的分割之后的数组十位数之和
   let sumTotal = 0;
   for (let m = 0; m < arrJiShu.length; m++) {
     sumJiShu = sumJiShu + parseInt(arrJiShu[m]);
   }
   for (let n = 0; n < arrOuShu.length; n++) {
     sumOuShu = sumOuShu + parseInt(arrOuShu[n]);
   }
   for (let p = 0; p < jishuChild1.length; p++) {
     sumJiShuChild1 = sumJiShuChild1 + parseInt(jishuChild1[p]);
     sumJiShuChild2 = sumJiShuChild2 + parseInt(jishuChild2[p]);
   }
   //计算总和
   sumTotal = sumJiShu + sumOuShu + sumJiShuChild1 + sumJiShuChild2;
   //计算luhn值
   let k = sumTotal % 10 === 0 ? 10 :sumTotal % 10;
   let luhn = 10 - k;
   if (parseInt(lastNum) === luhn) {
     return '';
   } else {
     return '请输入正确的银行卡号';
   }
 }

 

5.密码校验

password(value: string): void | string {
 if (!value) return '请输入密码';
 const errText = '密码需包含大写字母、小写字母、数字、英文符号任意三种类型,长度8位-20位(含)';
   // 写出数字、大小写字母、字符这4种正则表达式
   const rC = {
     lw: '[a-z]',
     uw: '[A-Z]',
     nw: '[0-9]',
     rw: '[\\u0020-\\u002F\\u003A-\\u0040\\u005B-\\u0060\\u007B-\\u007E]'
   };

   // 写出正则校验函数
   function Reg(str: string, rStr: string) {
     const reg = new RegExp(rStr);
     return reg.test(str)
   }

   const tR = {
     l: Reg(value, rC.lw),
     u: Reg(value, rC.uw),
     n: Reg(value, rC.nw),
     s: Reg(value, rC.rw)
   };
   // 校验
   if (value.length < 8 || value.length>20) {
     return errText;
   } else {
     if ((tR.l && tR.u && tR.n) || (tR.l && tR.u && tR.s) || (tR.s && tR.u && tR.n) || (tR.s && tR.l && tR.n)) {
       return undefined;
     } else {
       return errText;
     }
   }
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值