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; } } }