# 正则校验封装
**Repository Path**: qisx7749/Reg
## Basic Information
- **Project Name**: 正则校验封装
- **Description**: No description available
- **Primary Language**: JavaScript
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-07-01
- **Last Updated**: 2026-07-01
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 全网通用前端/Node.js 正则校验工具库(完整可复用源码)
## 一、前言
日常开发中,表单校验、数据格式判断是高频需求:手机号、身份证、URL、银行卡、车牌号、日期、IP、文件路径、账号密码……零散正则写在业务里难以维护、复用性差。
本文基于一套完整通用正则规则,封装**开箱即用、同时兼容浏览器&Node.js** 的校验工具类,分类清晰、API 语义化,支持单条校验、批量校验,可直接复制到项目使用,也适合统一团队校验规范。
### 适用场景
1. H5/PC 网页表单校验
2. Node.js 后端入参校验
3. Vue/React 全局校验公共方法
4. 统一团队正则规范,避免重复造轮子
## 二、完整工具源码
```javascript
/**
* 通用正则校验工具类
* 覆盖网络、身份、金融、时间、文件路径、账号密码、字符匹配等全场景正则
* 兼容浏览器 / Node.js 双环境
* @author 自定义
*/
class RegExpValidator {
/**
* 全部正则规则库,按业务分类整理
*/
static rules = {
// ========== 交通车次 ==========
trainNumber: /^[GCDZTSPKXLY1-9]\d{1,4}$/, // 火车车次
// ========== 设备硬件 ==========
imei: /^\d{15,17}$/, // 手机机身码IMEI
macAddress: /^(([a-f0-9][0,2,4,6,8,a,c,e]:([a-f0-9]{2}:){4})|([a-f0-9][0,2,4,6,8,a,c,e]-([a-f0-9]{2}-){4}))[a-f0-9]{2}$/i, // MAC地址
// ========== 网络地址、链接、IP、域名 ==========
urlWithPort: /^((ht|f)tps?:\/\/)?[\w-]+(\.[\w-]+)+:\d{1,5}\/?$/, // 带端口网址/IP
url: /^(((ht|f)tps?):\/\/)?([^!@#$%^&*?.\s-]([^!@#$%^&*?.\s]{0,63}[^!@#$%^&*?.\s])?\.)+[a-z]{2,6}\/?/, // 通用URL网址
domain: /^([0-9a-zA-Z-]{1,}\.)+([a-zA-Z]{2,})$/, // 纯域名(无http协议)
subnetMask: /^(254|252|248|240|224|192|128)\.0\.0\.0|255\.(254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(255|254|252|248|240|224|192|128|0)$/, // 子网掩码
ipv4WithPort: /^((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])(?::(?:[0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$/, // IPv4(可选端口)
ipv6WithPort: /(^(?:(?:(?:[0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$)|(^\[(?:(?:(?:[0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))\](?::(?:[0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$)/i, // IPv6(可选端口)
thunderLink: /^thunderx?:\/\/[a-zA-Z\d]+=$/, // 迅雷链接
ed2kLink: /^ed2k:\/\/\|file\|.+\|\/$/, // ed2k下载链接
magnetLink: /^magnet:\?xt=urn:btih:[0-9a-fA-F]{40,}.*$/, // 磁力链接
// ========== 企业资质 ==========
socialCreditCode: /^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$/, // 标准统一社会信用代码
socialCreditCodeLoose: /^(([0-9A-Za-z]{15})|([0-9A-Za-z]{18})|([0-9A-Za-z]{20}))$/, // 宽松信用代码(15/18/20位)
// ========== 文件路径 Linux / Windows ==========
linuxHiddenFilePath: /^\/(?:[^/]+\/)*\.[^/]*/, // Linux隐藏文件路径
linuxFolderPath: /^\/(?:[^/]+\/)*$/, // Linux文件夹路径
linuxFilePath: /^\/(?:[^/]+\/)*[^/]+$/, // Linux普通文件路径
windowsFolderPath: /^[a-zA-Z]:\\(?:\w+\\?)*$/, // Windows文件夹路径
windowsFilePath: /^[a-zA-Z]:\\(?:\w+\\)*\w+\.\w+$/, // Windows文件完整路径
// ========== 金融相关 ==========
stockCode: /^(s[hz]|S[HZ])(000[\d]{3}|002[\d]{3}|300[\d]{3}|600[\d]{3}|60[\d]{4})$/, // A股股票代码
bankCardNumber: /^[1-9]\d{9,29}$/, // 银行卡号10~30位
currency: /^-?\d{1,3}(,\d{3})*(\.\d{1,2})?$/, // 金额(支持千分位、负数、两位小数)
// ========== 教育分数 ==========
examScore: /^150$|^(?:\d|[1-9]\d|1[0-4]\d)(?:\.5)?$/, // 0~150考卷分数,仅支持.5小数
// ========== 加密、媒体、格式校验 ==========
htmlComment: //g, // HTML注释匹配
htmlTagLoose: /<(\w+)[^>]*>(.*?<\/\1>)?/, // HTML标签宽松匹配
md5: /^[a-fA-F0-9]{32}$/, // 32位MD5
guid: /^[a-f\d]{4}(?:[a-f\d]{4}-){4}[a-f\d]{12}$/i, // UUID/GUID
version: /^\d+(?:\.\d+){2}$/, // 版本号 X.Y.Z
base64: /^\s*data:(?:[a-z]+\/[a-z0-9-+.]+(?:;[a-z-]+=[a-z0-9-]+)?)?(?:;base64)?,([a-z0-9!$&',()*+;=\-._~:@/?%\s]*?)\s*$/i, // Base64字符串
hexColor: /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/, // 十六进制颜色 #fff / #ffffff
videoUrl: /^https?:\/\/(.+\/)+.+(\.(swf|avi|flv|mpg|rm|mov|wav|asf|3gp|mkv|rmvb|mp4))$/i, // 视频直链
imageUrl: /^https?:\/\/(.+\/)+.+(\.(gif|png|jpg|jpeg|webp|svg|psd|bmp|tif))$/i, // 图片直链
// ========== 时间日期 ==========
time24h: /^(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d$/, // 24小时制 HH:mm:ss
time12h: /^(?:1[0-2]|0?[1-9]):[0-5]\d:[0-5]\d$/, // 12小时制 hh:mm:ss
dateLoose: /^\d{1,4}(-)(1[0-2]|0?[1-9])\1(0?[1-9]|[1-2]\d|30|31)$/, // 宽松日期 yyyy-M-d
dateStrict: /^(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)$/, // 严谨日期(含闰年2.29)
momentTime: /^\d{4}([/:-\S])(1[0-2]|0?[1-9])\1(0?[1-9]|[1-2]\d|30|31) (?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d$/, // yyyy-MM-dd HH:mm:ss 标准时间
// ========== 通讯、邮政 ==========
email: /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/, // 标准邮箱
emailWithChinese: /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/, // 支持中文前缀邮箱
phoneMobileStrict: /^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[1589]))\d{8}$/, // 工信部严谨手机号段
phoneMobileLoose: /^(?:(?:\+|00)86)?1[3-9]\d{9}$/, // 宽松手机号(13~19开头)
phoneMobileMostLoose: /^(?:(?:\+|00)86)?1\d{10}$/, // 最宽松手机号(仅判断1开头11位)
phoneLandline: /^(?:(?:\d{3}-)?\d{8}|^(?:\d{4}-)?\d{7,8})(?:-\d+)?$/, // 国内座机
zipCode: /^(0[1-7]|1[0-356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[0-5]|8[013-6])\d{4}$/, // 国内邮政编码
// ========== 各类身份证件 ==========
idCard15: /^[1-9]\d{7}(?:0\d|10|11|12)(?:0[1-9]|[1-2][\d]|30|31)\d{3}$/, // 一代15位身份证
idCard18: /^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[\dXx]$/, // 二代18位身份证
idCard: /^\d{6}((((((19|20)\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(((19|20)\d{2})(0[13578]|1[02])31)|((19|20)\d{2})02(0[1-9]|1\d|2[0-8])|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))0229))\d{3})|((((\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|((\d{2})(0[13578]|1[02])31)|((\d{2})02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[48])0229))\d{2}))(\d|X|x)$/, // 兼容15/18位身份证
passport: /(^[EeKkGgDdSsPpHh]\d{8}$)|(^(([Ee][a-fA-F])|([DdSsPp][Ee])|([Kk][Jj])|([Mm][Aa])|(1[45]))\d{7}$)/, // 护照(港澳通行证)
hongKongId: /^[a-zA-Z]\d{6}\([\dA]\)$/, // 香港身份证
macauId: /^[1|5|7]\d{6}\(\d\)$/, // 澳门身份证
taiwanId: /^[a-zA-Z][0-9]{9}$/, // 台湾身份证
militaryId: /^[\u4E00-\u9FA5](字第)([0-9a-zA-Z]{4,8})(号?)$/, // 军官/士兵证
householdRegister: /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/, // 户口簿编号
// ========== 地址省份 ==========
chineseProvince: /^浙江|上海|北京|天津|重庆|黑龙江|吉林|辽宁|内蒙古|河北|新疆|甘肃|青海|陕西|宁夏|河南|山东|山西|安徽|湖北|湖南|江苏|四川|贵州|云南|广西|西藏|江西|广东|福建|台湾|海南|香港|澳门$/,
// ========== 账号社交 ==========
usernameValid: /^[a-zA-Z]\w{4,15}$/, // 账号:字母开头,5-16位字母数字下划线
username4To16: /^[\w-]{4,16}$/, // 用户名:4~16位 字母/数字/_/-
wechatId: /^[a-zA-Z][-_a-zA-Z0-9]{5,19}$/, // 微信号6-20位字母开头
qqNumber: /^[1-9][0-9]{4,10}$/, // QQ号
// ========== 车牌号 ==========
carPlateNewEnergy: /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z](?:((\d{5}[A-HJK])|([A-HJK][A-HJ-NP-Z0-9][0-9]{4}))|[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳])$/,
carPlateNormal: /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]$/,
carPlate: /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z][A-HJ-NP-Z0-9]{4,5}[A-HJ-NP-Z0-9挂学警港澳]$/,
// ========== 字符匹配(中文、字母、数字组合) ==========
chinese: /^(?:[\u3400-\u4DB5\u4E00-\u9FEA\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]|[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0])+$/, // 纯中文
chineseAndPunctuation: /[\u4e00-\u9fa5|\u3002|\uff1f|\uff01|\uff0c|\u3001|\uff1b|\uff1a|\u201c|\u201d|\u2018|\u2019|\uff08|\uff09|\u300a|\u300b|\u3008|\u3009|\u3010|\u3011|\u300e|\u300f|\u300c|\u300d|\ufe43|\ufe44|\u3014|\u3015|\u2026|\u2014|\uff5e|\ufe4f|\uffe5]/, // 中文+中文标点
chineseName: /^(?:[\u4e00-\u9fa5·]{2,16})$/, // 中文姓名(支持间隔号,2-16字)
englishName: /(^[a-zA-Z][a-zA-Z\s]{0,20}[a-zA-Z]$)/, // 英文姓名(带空格)
englishLetter: /^[a-zA-Z]+$/, // 纯英文字母
lowercaseLetter: /^[a-z]+$/, // 纯小写字母
uppercaseLetter: /^[A-Z]+$/, // 纯大写字母
numberAndLetter: /^[A-Za-z0-9]+$/, // 仅数字+字母
numberAndLetterBoth: /^(?=.*[a-zA-Z])(?=.*\d).+$/, // 同时包含数字+字母
chineseAndNumber: /^((?:[\u3400-\u4DB5\u4E00-\u9FEA\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]|[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0])|(\d))+$/, // 中文+数字
noLetter: /^[^A-Za-z]*$/, // 不含任何英文字母
repeatChar: /(.)\1+/, // 匹配连续重复字符(如 111、啊啊啊)
asciiSpecialChar: /[\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]+/, // ASCII特殊符号
// ========== 数字类型 ==========
numberOnly: /^\d+$/, // 纯数字
positiveInteger: /^\+?[1-9]\d*$/, // 正整数(不含0)
negativeInteger: /^-[1-9]\d*$/, // 负整数(不含0)
integer: /^(?:0|(?:-?[1-9]\d*))$/, // 整数(包含0、正负)
decimal: /^[+-]?(\d+([.]\d*)?([eE][+-]?\d+)?|[.]\d+([eE][+-]?\d+)?)$/, // 小数(支持科学计数法)
floatNumber: /^(-?[1-9]\d*\.\d+|-?0\.\d*[1-9]\d*|0\.0+)$/, // 浮点数
floatNumberStrict: /^(-?[1-9]\d*\.\d+|-?0\.\d*[1-9])$/, // 严格浮点数(禁止末尾.)
// ========== 密码强度校验 ==========
passwordStrong: /^\S*(?=\S{6,})(?=\S*\d)(?=\S*[A-Z])(?=\S*[a-z])(?=\S*[!@#$%^&*? ])\S*$/, // 强密码:6位以上,大小写+数字+特殊符号
passwordThreeTypes: /^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_!@#$%^&*`~()-+=]+$)(?![a-z0-9]+$)(?![a-z\W_!@#$%^&*`~()-+=]+$)(?![0-9\W_!@#$%^&*`~()-+=]+$)[a-zA-Z0-9\W_!@#$%^&*`~()-+=]/, // 密码包含三类字符
// ========== Java相关 ==========
javaPackage: /^([a-zA-Z_]\w*)+([.][a-zA-Z_]\w*)+$/ // Java包名
};
/**
* 底层通用校验方法
* @param {string|number} value 需要校验的值
* @param {RegExp} reg 正则表达式
* @returns {boolean} 是否匹配
*/
static validate(value, reg) {
if (value === null || value === undefined || value === '') return false;
const str = String(value);
return reg.test(str);
}
// ===================== 快捷校验方法(按分类,语义化调用) =====================
// 车次
static validateTrainNumber(val) { return this.validate(val, this.rules.trainNumber); }
// 设备
static validateIMEI(val) { return this.validate(val, this.rules.imei); }
static validateMacAddress(val) { return this.validate(val, this.rules.macAddress); }
// 网络链接
static validateUrlWithPort(val) { return this.validate(val, this.rules.urlWithPort); }
static validateUrl(val) { return this.validate(val, this.rules.url); }
static validateDomain(val) { return this.validate(val, this.rules.domain); }
static validateSubnetMask(val) { return this.validate(val, this.rules.subnetMask); }
static validateIPv4(val) { return this.validate(val, this.rules.ipv4WithPort); }
static validateIPv6(val) { return this.validate(val, this.rules.ipv6WithPort); }
static validateThunder(val) { return this.validate(val, this.rules.thunderLink); }
static validateEd2k(val) { return this.validate(val, this.rules.ed2kLink); }
static validateMagnet(val) { return this.validate(val, this.rules.magnetLink); }
// 企业资质
static validateCreditCode(val) { return this.validate(val, this.rules.socialCreditCode); }
static validateCreditCodeLoose(val) { return this.validate(val, this.rules.socialCreditCodeLoose); }
// 文件路径
static validateLinuxHiddenPath(val) { return this.validate(val, this.rules.linuxHiddenFilePath); }
static validateLinuxFolder(val) { return this.validate(val, this.rules.linuxFolderPath); }
static validateLinuxFile(val) { return this.validate(val, this.rules.linuxFilePath); }
static validateWinFolder(val) { return this.validate(val, this.rules.windowsFolderPath); }
static validateWinFile(val) { return this.validate(val, this.rules.windowsFilePath); }
// 金融
static validateStockCode(val) { return this.validate(val, this.rules.stockCode); }
static validateBankCard(val) { return this.validate(val, this.rules.bankCardNumber); }
static validateCurrency(val) { return this.validate(val, this.rules.currency); }
// 分数
static validateScore(val) { return this.validate(val, this.rules.examScore); }
// 格式加密
static validateMD5(val) { return this.validate(val, this.rules.md5); }
static validateUUID(val) { return this.validate(val, this.rules.guid); }
static validateVersion(val) { return this.validate(val, this.rules.version); }
static validateBase64(val) { return this.validate(val, this.rules.base64); }
static validateHexColor(val) { return this.validate(val, this.rules.hexColor); }
static validateVideoUrl(val) { return this.validate(val, this.rules.videoUrl); }
static validateImageUrl(val) { return this.validate(val, this.rules.imageUrl); }
// 时间
static validateTime24(val) { return this.validate(val, this.rules.time24h); }
static validateTime12(val) { return this.validate(val, this.rules.time12h); }
static validateDateLoose(val) { return this.validate(val, this.rules.dateLoose); }
static validateDateStrict(val) { return this.validate(val, this.rules.dateStrict); }
static validateMomentTime(val) { return this.validate(val, this.rules.momentTime); }
// 通讯
static validateEmail(val) { return this.validate(val, this.rules.email); }
static validateEmailCn(val) { return this.validate(val, this.rules.emailWithChinese); }
static validatePhoneStrict(val) { return this.validate(val, this.rules.phoneMobileStrict); }
static validatePhoneLoose(val) { return this.validate(val, this.rules.phoneMobileLoose); }
static validatePhoneMostLoose(val) { return this.validate(val, this.rules.phoneMobileMostLoose); }
static validateLandline(val) { return this.validate(val, this.rules.phoneLandline); }
static validateZipCode(val) { return this.validate(val, this.rules.zipCode); }
// 证件
static validateIdCard15(val) { return this.validate(val, this.rules.idCard15); }
static validateIdCard18(val) { return this.validate(val, this.rules.idCard18); }
static validateIdCard(val) { return this.validate(val, this.rules.idCard); }
static validatePassport(val) { return this.validate(val, this.rules.passport); }
static validateHKId(val) { return this.validate(val, this.rules.hongKongId); }
static validateMacauId(val) { return this.validate(val, this.rules.macauId); }
static validateTwId(val) { return this.validate(val, this.rules.taiwanId); }
static validateMilitaryCert(val) { return this.validate(val, this.rules.militaryId); }
static validateHousehold(val) { return this.validate(val, this.rules.householdRegister); }
// 省份
static validateProvince(val) { return this.validate(val, this.rules.chineseProvince); }
// 账号社交
static validateAccount(val) { return this.validate(val, this.rules.usernameValid); }
static validateUserName(val) { return this.validate(val, this.rules.username4To16); }
static validateWechat(val) { return this.validate(val, this.rules.wechatId); }
static validateQQ(val) { return this.validate(val, this.rules.qqNumber); }
// 车牌
static validateNewEnergyPlate(val) { return this.validate(val, this.rules.carPlateNewEnergy); }
static validateNormalPlate(val) { return this.validate(val, this.rules.carPlateNormal); }
static validatePlate(val) { return this.validate(val, this.rules.carPlate); }
// 字符
static validateChinese(val) { return this.validate(val, this.rules.chinese); }
static validateChineseName(val) { return this.validate(val, this.rules.chineseName); }
static validateEnglishName(val) { return this.validate(val, this.rules.englishName); }
static validateOnlyLetter(val) { return this.validate(val, this.rules.englishLetter); }
static validateLowerLetter(val) { return this.validate(val, this.rules.lowercaseLetter); }
static validateUpperLetter(val) { return this.validate(val, this.rules.uppercaseLetter); }
static validateNumAndLetter(val) { return this.validate(val, this.rules.numberAndLetter); }
static validateHasNumAndLetter(val) { return this.validate(val, this.rules.numberAndLetterBoth); }
static validateCnAndNum(val) { return this.validate(val, this.rules.chineseAndNumber); }
static validateNoLetter(val) { return this.validate(val, this.rules.noLetter); }
static validateHasRepeatChar(val) { return this.validate(val, this.rules.repeatChar); }
// 数字
static validateOnlyNum(val) { return this.validate(val, this.rules.numberOnly); }
static validatePositiveInt(val) { return this.validate(val, this.rules.positiveInteger); }
static validateNegativeInt(val) { return this.validate(val, this.rules.negativeInteger); }
static validateInteger(val) { return this.validate(val, this.rules.integer); }
static validateDecimal(val) { return this.validate(val, this.rules.decimal); }
static validateFloat(val) { return this.validate(val, this.rules.floatNumber); }
static validateFloatStrict(val) { return this.validate(val, this.rules.floatNumberStrict); }
// 密码
static validateStrongPwd(val) { return this.validate(val, this.rules.passwordStrong); }
static validateThreeTypePwd(val) { return this.validate(val, this.rules.passwordThreeTypes); }
// Java包名
static validateJavaPackage(val) { return this.validate(val, this.rules.javaPackage); }
/**
* 批量批量表单校验
* @param {Object} map 校验对象 {字段名: {value: 待校验值, rule: rules内规则key}}
* @returns {Object} { 字段: boolean, isValid: 整体是否全部通过 }
*/
static batchValidate(map) {
const res = { isValid: true };
for (const [key, item] of Object.entries(map)) {
const pass = this.validate(item.value, this.rules[item.rule]);
res[key] = pass;
if (!pass) res.isValid = false;
}
return res;
}
}
// Node.js 导出
if (typeof module !== 'undefined' && module.exports) {
module.exports = RegExpValidator;
}
// 浏览器挂载全局
if (typeof window !== 'undefined') {
window.RegExpValidator = RegExpValidator;
}
```
## 三、使用示例
### 1. 单个字段校验(最常用,表单输入框)
```javascript
// 校验手机号
console.log(RegExpValidator.validatePhoneLoose('13800013800')); // true
console.log(RegExpValidator.validatePhoneLoose('123456')); // false
// 校验身份证
console.log(RegExpValidator.validateIdCard('11010119900307123X')); // true
// 校验邮箱
console.log(RegExpValidator.validateEmail('test@qq.com')); // true
// 校验银行卡
console.log(RegExpValidator.validateBankCard('6222021234567890123')); // true
// 校验微信号
console.log(RegExpValidator.validateWechat('wx_666abc')); // true
```
### 2. 底层通用方法(自定义正则/临时匹配)
```javascript
// 直接传入规则库内正则
const reg = RegExpValidator.rules.domain;
console.log(RegExpValidator.validate('www.baidu.com', reg)); // true
```
### 3. 批量表单一次性校验(登录/注册表单)
```javascript
const form = {
phone: { value: '13800013800', rule: 'phoneMobileLoose' },
email: { value: 'test@qq.com', rule: 'email' },
idCard: { value: '11010119900307123X', rule: 'idCard' }
};
const result = RegExpValidator.batchValidate(form);
console.log(result);
// { phone: true, email: true, idCard: true, isValid: true }
if (result.isValid) {
console.log('表单全部校验通过,可以提交');
} else {
console.log('存在字段格式错误');
}
```
## 四、项目接入方案
### 方案1:Node.js / Vue3 / React TS 项目
1. 新建文件 `utils/regValidator.js`,粘贴全部源码
2. 在业务页面导入使用
```javascript
import RegExpValidator from '@/utils/regValidator';
console.log(RegExpValidator.validateQQ('12345678'));
```
### 方案2:原生HTML页面(浏览器全局)
直接在script标签引入,全局可调用 `RegExpValidator`
```html
```
## 五、工具优势总结
1. **全覆盖场景**:包含日常开发99%的格式校验正则,无需网上零散复制
2. **分类清晰**:正则按业务场景分组,查找、修改、新增规则一目了然
3. **双端兼容**:同时支持浏览器、Node.js,前后端可共用一套校验逻辑
4. **API友好**:语义化快捷方法,不用记忆复杂正则字符串
5. **批量校验**:内置表单批量校验方法,减少重复if判断
6. **易扩展**:新增正则只需在`rules`对象添加,可选配套快捷校验函数
7. **规范统一**:团队共用一套正则标准,避免每个人写的正则不一致导致bug
## 六、扩展新增规则示例
如果需要新增自定义校验规则,两步即可完成:
```javascript
// 1. 在rules对象新增key和正则
RegExpValidator.rules.expireDate = /^\d{4}-\d{2}-\d{2}$/;
// 2. 新增快捷方法(可选)
RegExpValidator.validateExpireDate = function(val) {
return this.validate(val, this.rules.expireDate);
};
// 使用
console.log(RegExpValidator.validateExpireDate('2030-12-31'));
```