常用的正则校准

24 阅读4分钟
  1. 必填
/**
 * 必填
 * @param rule
 * @param value
 * @param callback
 */
export const required = (rule: string, value: string | number, callback: any) => {
  if ((!value || !value.toString().trim()) && value !== 0 && value !== "0") {
    callback(new Error("必填"));
  }
  return callback();
};
  1. 正整数
/**
 * 正整数
 * @param rule
 * @param value
 * @param callback
 */
export const positiveIntegerChecker = (rule: any, value: any, callback: any) => {
  let regex = /^\+?[1-9][0-9]*$/; // 正整数
  if (!value) {
    return callback();
  }
  if (regex.test(value)) {
    return callback();
  }
  callback(new Error("只能输入正整数"));
};

  1. 正整数+0
/* 正整数+0
 * @param rule
 * @param value
 * @param callback
 */
export const nonnegativeIntegerChecker = (rule: any, value: any, callback: any) => {
  let regex = /^([1-9][0-9]*|0)$/;
  if (!value) {
    return callback();
  }
  if (regex.test(value)) {
    return callback();
  }
  callback(new Error("只能输入非负整数"));
};
  1. 正整数和正小数
/**
 * 正数(正整数和正小数)
 * @param rule
 * @param value
 * @param callback
 */
export const positiveNumberChecker = (rule: any, value: any, callback: any) => {
  const regex = /^(([1-9]\d*)|0)(\.\d*)?$/;
  if (!value) {
    return callback();
  }
  if (value && !isNaN(value) && value > 0 && regex.test(value)) {
    return callback();
  }
  callback(new Error("只能输入正整数或正小数"));
};
  1. 小数校验,严格控制小数位
/**
 * 小数校验,严格控制小数位
 * @param rule
 * @param value
 * @param {any} callback
 * @param {number} integer 整数部分最大位数 Maximum number of digits in the integer part
 * @param {number} decimal 小数部分最大位数 Maximum number of digits in decimal part
 * @returns {any}
 */
export const floatNumberChecker = (rule: any, value: any, callback: any, integer: number, decimal: number) => {
  if (!value) {
    return callback();
  }
  const regex = /^(([1-9]\d*)|0)(\.\d*)?$/;
  const parts = (value + "").split(".");
  if (parts && parts.length === 1 && regex.test(value)) {
    if (parts[0].length <= integer) {
      return callback();
    }
  }
  if (parts && parts.length === 2 && regex.test(value)) {
    if (parts[1].length === 0) {
      callback(new Error(i18n.t("validator.floatNumberError")));
    }
    if (parts[0].length <= integer && parts[1].length <= decimal) {
      return callback();
    }
  }
  callback(new Error(`最多${integer}位整数,${decimal}位小数`));
};
  1. 小数校验,严格控制小数位
/**
 * 小数校验,严格控制小数位
 * @param rule
 * @param value
 * @param {any} callback
 * @param {number} decimal 小数部分最大位数 Maximum number of digits in decimal part
 * @returns {any}
 */
export const floatNumberCheckerDecimal = (rule: any, value: any, callback: any, decimal: number) => {
  const regex = /^(([1-9]\d*)|0)(\.\d*)?$/;
  const parts = (value + "").split(".");
  if (!value) {
    return callback();
  }
  if (regex.test(value)) {
    if (parts && parts.length === 2) {
      if (parts[1].length <= decimal) {
        return callback();
      }
    } else {
      return callback();
    }
  }
  callback(new Error(`最多支持${decimal}位小数`));
};
  1. 长度不能大于maxLength
/**
 * 长度不能大于maxLength
 * @param rule
 * @param value
 * @param callback
 * @param maxLength
 * @returns {*}
 */
export const maxLengthChecker = (rule: any, value: any, callback: any, maxLength: number) => {
  if (typeof value === "number") {
    value = value + "";
  }
  if (!value || (value && value.length <= maxLength)) {
    return callback();
  }
  callback(new Error(`长度不能大于${maxLength}`));
};
  1. 长度只能是length
/** 
* 长度只能是length
* @param rule 
* @param value 
* @param callback 
* @param length 
* @returns {*} 
*/
export const equalNumberChecker = (rule: any, value: any, callback: any, length: number) => {
  if (typeof value === "number") {
    value = value + "";
  }
  if (!value || (value && value.length === length)) {
    return callback();
  }
  callback(new Error(`长度只能等于${length}`));
};
  1. 只能输入数字
/**
 * 只能输入数字
 * @param rule
 * @param value
 * @param callback
 */
export const numberOnlyChecker = (rule: any, value: any, callback: any) => {
  let regex = /^[0-9]*$/; // 数字
  if (value && !regex.test(value)) {
    callback(new Error("只能输入数字"));
  }
  return callback();
};
  1. 数值不能大于
/**
 * 数值不能大于
 * @param rule
 * @param value
 * @param callback
 * @param maxLength
 * @returns {*}
 */
export const maxNumberChecker = (rule: any, value: any, callback: any, maxNumber: number) => {
  if (!value || (value && Number(value) <= maxNumber)) {
    return callback();
  }
  callback(new Error(`不能超过${max}`));
};
  1. 数值范围限制
/**
 * 数值范围限制
 * @param rule
 * @param value
 * @param callback
 * @param minNumber
 * @param maxNumber
 * @returns
 */
export const numberRangeChecker = (rule: any, value: any, callback: any, minNumber: number, maxNumber: number) => {
  if (!value || (value && Number(value) <= maxNumber && Number(value) >= minNumber)) {
    return callback();
  }
  callback(new Error(`值的范围需要在 ${min}${max} 之间`));
};
  1. 只能输入数字和英文
/**
 * 只能输入数字和英文
 * @param rule
 * @param value
 * @param callback
 */
export const numberCommaOnlyChecker = (rule: any, value: any, callback: any) => {
  let regex = /^[0-9,]*$/; // 数字
  if (value && !regex.test(value)) {
    callback(new Error("只能输入数字和英文逗号"));
  }
  return callback();
};
  1. 校验为合法名称-字母、数字、下划线
/**
 * 校验为合法名称-字母、数字、下划线
 * @param rule
 * @param value
 * @param callback
 */
export const nameValidate = (rule: string, value: string, callback: any) => {
  const reg = /^[\u4e00-\u9fa5_a-zA-Z0-9]+$/;
  if (value && !reg.test(value)) {
    callback(new Error("只支持字母数字和下划线"));
  }
  return callback();
};
  1. 校验为合法名称-字母、数字
/**
 * 校验为合法名称-字母、数字
 * @param rule
 * @param value
 * @param callback
 */
export const numberLetterValidate = (rule: string, value: string, callback: any) => {
  const reg = /^[a-zA-Z0-9]+$/;
  if (value && !reg.test(value)) {
    callback(new Error("只能输入字母和数字"));
  }
  return callback();
};
  1. 字母、数字、空格、#、中划线、+、下划线校验
/**
 * 字母、数字、空格、#、中划线、+、下划线校验
 * @param rule
 * @param value
 * @param callback
 */
export const letterNumberWithSpecialCharsValidate = (rule: string, value: string, callback: any) => {
  const reg = /^[a-zA-Z0-9\s#\-_+]+$/;
  if (value && !reg.test(value)) {
    callback(new Error("**只能输入字母、数字、空格、‘#’、‘-’、‘+’ 和 ‘_’**"));
  }
  return callback();
};
  1. 校验为合法名称-特殊字符
/**
 * 校验为合法名称-特殊字符
 * @param rule
 * @param value
 * @param callback
 */
export const htmlArrowCharter = (rule: string, value: string, callback: any) => {
  const regExp = /[<>]/im;
  if (regExp.test(value)) {
    callback(new Error("不能输入<>"));
  }
  return callback();
};
  1. 不能输入中文
/** 
* 不能输入中文
* @param rule 
* @param value 
* @param callback 
*/
export const noChineseChecker = (rule: any, value: any, callback: any) => {
  const regex = /^[\x00-\xff]*$/; // 匹配所有非中文字符
  if (!value) {
    return callback();
  }
  if (value && regex.test(value)) {
    return callback();
  }
  callback(new Error("不能输入中文");
};
  1. 数组必填校验

/**
 * 数组必填校验
 * @param rule
 * @param value
 * @param callback
 */
export const requiredArr = (rule: string, value: Array<number>, callback: any) => {
  if (!value || !value.length) {
    callback(new Error("必填"));
  }
  return callback();
};

  1. 身份证验证
/**
 * 身份证查询
 * @param rule
 * @param value
 * @param callback
 */
export const idCardChecker = (rule: string, value: string, callback: any) => {
  const reg = /^[xX0-9]+$/;
  if (value && !reg.test(value)) {
    callback(new Error("只支持数字和字母X"));
  }
  return callback();
};
  1. 手机号合法校验
/**
 * 手机号合法校验
 * @param rule
 * @param value
 * @param callback
 */
export const phoneValidate = (rule: string, value: string, callback: any) => {
  const reg = /^[1]([3-9])[0-9]{9}$/;
  if (value && !reg.test(value)) {
    callback(new Error("请输入正确的11位手机号格式");
  }
  return callback();
};
  1. 邮箱地址合法校验
/**
 * 邮箱地址合法校验
 * @param rule
 * @param value
 * @param callback
 */
export const emailValidateWith = (rule: string, value: string, callback: any) => {
  const reg = /^([A-Za-z*0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
  if (value && !reg.test(value)) {
    callback(new Error("请输入正确的邮箱格式");
  }
  return callback();
};
  1. 校验表情符
/***
 * 校验表情符
 * Check emoticons
 * var regex = /uD83C|uD83D|uD83E[u200D|uFE0F]|uD83C|uD83D|uD83E|[0-9|*|#]uFE0Fu20E3|[0-9|#]u20E3|[u203C-u3299]uFE0Fu200D|[u203C-u3299]uFE0F|[u2122-u2B55]|u303D|[A9|AE]u3030|uA9|uAE|u3030/;
 *
 */
export const emojiChecker = (rule: any, value: any, callback: any) => {
  // eslint-disable-next-line complexity
  let hasEmoji = (substring: string) => {
    for (let i = 0; i < substring.length; i++) {
      let hs = substring.charCodeAt(i);
      if (0xd800 <= hs && hs <= 0xdbff) {
        if (substring.length > 1) {
          let ls = substring.charCodeAt(i + 1);
          let uc = (hs - 0xd800) * 0x400 + (ls - 0xdc00) + 0x10000;
          if (0x1d000 <= uc && uc <= 0x1f77f) {
            return true;
          }
        }
      } else if (substring.length > 1) {
        let ls = substring.charCodeAt(i + 1);
        if (ls === 0x20e3) {
          return true;
        }
      } else if (0x2100 <= hs && hs <= 0x27ff) {
        return true;
      } else if (0x2b05 <= hs && hs <= 0x2b07) {
        return true;
      } else if (0x2934 <= hs && hs <= 0x2935) {
        return true;
      } else if (0x3297 <= hs && hs <= 0x3299) {
        return true;
      } else if (
        hs === 0xa9 ||
        hs === 0xae ||
        hs === 0x303d ||
        hs === 0x3030 ||
        hs === 0x2b55 ||
        hs === 0x2b1c ||
        hs === 0x2b1b ||
        hs === 0x2b50
      ) {
        return true;
      }
    }
  };
  if (hasEmoji(value)) {
    callback(new Error("不能输入emoji表情"));
  }
  return callback();
};
  1. 链接http或https
/**
 * 链接http或https
 * @param rule
 * @param value
 * @param callback
 */
export const urlChecker = (rule: any, value: string, callback: any) => {
  const reg = /(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&amp;%\$#_]*)?/;
  if (value && !reg.test(value)) {
    return callback(new Error("请输入正确跳转链接(pc端)"));
  }
  return callback();
};