复制代码
import { FormatUtil } from './FormatUtil';
/**
* 正则工具类
* @author CSDN-鸿蒙布道师
* @since 2025/04/27
*/
export class RegexUtil {
/**
* 英文字母、数字和下划线
*/
static readonly REG_GENERAL = "^\\w+$";
/**
* 数字
*/
static readonly REG_NUMBERS = "^\\d+$";
/**
* 字母
*/
static readonly REG_WORD = "^[a-zA-Z]+$";
/**
* 单个中文汉字
* 参考维基百科汉字 Unicode 范围 (https://zh.wikipedia.org/wiki/%E6%B1%89%E5%AD%97)
*/
static readonly REG_CHINESE =
"^[\u2E80-\u2EFF\u2F00-\u2FDF\u31C0-\u31EF\u3400-\u4DBF\u4E00-\u9FFF\uF900-\uFAFF\uD840\uDC00-\uD869\uDEDF\uD869\uDF00-\uD86D\uDF3F\uD86D\uDF40-\uD86E\uDC1F\uD86E\uDC20-\uD873\uDEAF\uD87E\uDC00-\uD87E\uDE1F]$";
/**
* 中文汉字(一个或多个)
*/
static readonly REG_CHINESES = `${RegexUtil.REG_CHINESE}+`;
/**
* 分组匹配变量
*/
static readonly REG_GROUP_VAR = "^\\$(\\d+)$";
/**
* IPv4 地址
*/
static readonly REG_IPV4 =
"^(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)$";
/**
* IPv6 地址
*/
static readonly REG_IPV6 =
"^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9]))$";
/**
* 货币金额
*/
static readonly REG_MONEY = "^(\\d+(?:\\.\\d+)?)$";
/**
* 邮件地址,符合 RFC 5322 规范
* 来源:http://emailregex.com/
*/
static readonly REG_EMAIL =
"^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)])$";
/**
* 移动电话号码(中国大陆)
*/
static readonly REG_MOBILE = "^(?:0|86|\\+86)?1[3-9]\\d{9}$";
/**
* 中国香港移动电话号码
*/
static readonly REG_MOBILE_HK = "^(?:0|852|\\+852)?\\d{8}$";
/**
* 中国台湾移动电话号码
*/
static readonly REG_MOBILE_TW = "^(?:0|886|\\+886)?(?:|-)09\\d{8}$";
/**
* 中国澳门移动电话号码
*/
static readonly REG_MOBILE_MO = "^(?:0|853|\\+853)?(?:|-)6\\d{7}$";
/**
* 座机号码
*/
static readonly REG_TEL = "^(010|02\\d|0[3-9]\\d{2})-?(\\d{6,8})$";
/**
* 座机号码 + 400/800 电话
*/
static readonly REG_TEL_400_800 =
"^0\\d{2,3}[\\- ]?[1-9]\\d{6,7}|[48]00[\\- ]?[1-9]\\d{6}$";
/**
* 18 位身份证号码
*/
static readonly REG_CITIZEN_ID =
"^[1-9]\\d{5}[1-2]\\d{3}((0\\d)|(1[0-2]))(([012]\\d)|3[0-1])\\d{3}(\\d|X|x)$";
/**
* 邮编(兼容港澳台)
*/
static readonly REG_ZIP_CODE =
"^(0[1-7]|1[0-356]|2[0-7]|3[0-6]|4[0-7]|5[0-7]|6[0-7]|7[0-5]|8[0-9]|9[0-8])\\d{4}|99907[78]$";
/**
* 生日
*/
static readonly REG_BIRTHDAY =
"^(\\d{2,4})([/\\-.年]?)(\\d{1,2})([/\\-.月]?)(\\d{1,2})日?$";
/**
* URI
* 定义见:https://www.ietf.org/rfc/rfc3986.html#appendix-B
*/
static readonly REG_URI =
"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$";
/**
* URL
*/
static readonly REG_URL =
"^[a-zA-Z]+://[\\w-+&@#/%?=~_|!:,.;]*[\\w-+&@#/%=~_|]$";
/**
* HTTP URL(支持 FTP、File 等协议)
*/
static readonly REG_URL_HTTP =
"^(https?|ftp|file)://[\\w-+&@#/%?=~_|!:,.;]*[\\w-+&@#/%=~_|]$";
/**
* 中文字、英文字母、数字和下划线
*/
static readonly REG_GENERAL_WITH_CHINESE = "^[\u4E00-\u9FFF\\w]+$";
/**
* UUID
*/
static readonly REG_UUID =
"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$";
/**
* 不带横线的 UUID
*/
static readonly REG_UUID_SIMPLE = "^[0-9a-fA-F]{32}$";
/**
* MAC 地址
*/
static readonly REG_MAC_ADDRESS =
"^((?:[a-fA-F0-9]{1,2}[:-]){5}[a-fA-F0-9]{1,2})|0x(\\d{12}).+ETHER$";
/**
* 16 进制字符串
*/
static readonly REG_HEX = "^[a-fA-F0-9]+$";
/**
* 时间格式
*/
static readonly REG_TIME = "^\\d{1,2}:\\d{1,2}(:\\d{1,2})?$";
/**
* 中国车牌号码(兼容新能源车牌)
*/
static readonly REG_PLATE_NUMBER =
"^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[ABCDEFGHJK])|([ABCDEFGHJK]([A-HJ-NP-Z0-9])[0-9]{4})))|" +
"([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领]\\d{3}\\d{1,3}[领])|" +
"([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))$";
/**
* 社会统一信用代码
*/
static readonly REG_CREDIT_CODE =
"^[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}$";
/**
* 车架号(车辆识别代号)
*/
static readonly REG_CAR_VIN =
"^[A-HJ-NPR-Z0-9]{8}[0-9X][A-HJ-NPR-Z0-9]{2}\\d{6}$";
/**
* 驾驶证档案编号(中国驾驶证档案编号)
*/
static readonly REG_CAR_DRIVING_LICENCE = "^[0-9]{12}$";
/**
* 中文姓名
*/
static readonly REG_CHINESE_NAME = "^[\u2E80-\u9FFF·]{2,60}$";
/**
* 匹配表情符号(包括单个和组合表情)
*/
static readonly REG_EMOJI =
"(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])";
/**
* 判断内容是否匹配指定正则
* @param content 待验证的内容
* @param pattern 正则表达式
* @returns 是否匹配
*/
private static isMatch(content: string | null | undefined, pattern: string): boolean {
if (!content) return false;
const regex = new RegExp(pattern);
return regex.test(content);
}
/**
* 判断邮箱格式是否正确
* @param content 邮箱地址
* @returns 是否匹配
*/
static isEmail(content: string): boolean {
return RegexUtil.isMatch(content, RegexUtil.REG_EMAIL);
}
/**
* 判断是否包含表情符号
* @param content 待验证的内容
* @returns 是否包含表情
*/
static containsEmoji(content: string): boolean {
return RegexUtil.isMatch(content, RegexUtil.REG_EMOJI);
}
/**
* 判断电话号码格式是否正确
* @param phone 电话号码
* @returns 是否匹配
*/
static isPhone(phone: string): boolean {
return FormatUtil.isPhone(phone);
}
}
代码如下:
TypeScript
复制代码
import { FormatUtil } from './FormatUtil';
/**
* 正则工具类
* @author CSDN-鸿蒙布道师
* @since 2025/04/27
*/
export class RegexUtil {
/**
* 英文字母、数字和下划线
*/
static readonly REG_GENERAL = "^\\w+$";
/**
* 数字
*/
static readonly REG_NUMBERS = "^\\d+$";
/**
* 字母
*/
static readonly REG_WORD = "^[a-zA-Z]+$";
/**
* 单个中文汉字
* 参考维基百科汉字 Unicode 范围 (https://zh.wikipedia.org/wiki/%E6%B1%89%E5%AD%97)
*/
static readonly REG_CHINESE =
"^[\u2E80-\u2EFF\u2F00-\u2FDF\u31C0-\u31EF\u3400-\u4DBF\u4E00-\u9FFF\uF900-\uFAFF\uD840\uDC00-\uD869\uDEDF\uD869\uDF00-\uD86D\uDF3F\uD86D\uDF40-\uD86E\uDC1F\uD86E\uDC20-\uD873\uDEAF\uD87E\uDC00-\uD87E\uDE1F]$";
/**
* 中文汉字(一个或多个)
*/
static readonly REG_CHINESES = `${RegexUtil.REG_CHINESE}+`;
/**
* 分组匹配变量
*/
static readonly REG_GROUP_VAR = "^\\$(\\d+)$";
/**
* IPv4 地址
*/
static readonly REG_IPV4 =
"^(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)$";
/**
* IPv6 地址
*/
static readonly REG_IPV6 =
"^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9]))$";
/**
* 货币金额
*/
static readonly REG_MONEY = "^(\\d+(?:\\.\\d+)?)$";
/**
* 邮件地址,符合 RFC 5322 规范
* 来源:http://emailregex.com/
*/
static readonly REG_EMAIL =
"^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)])$";
/**
* 移动电话号码(中国大陆)
*/
static readonly REG_MOBILE = "^(?:0|86|\\+86)?1[3-9]\\d{9}$";
/**
* 中国香港移动电话号码
*/
static readonly REG_MOBILE_HK = "^(?:0|852|\\+852)?\\d{8}$";
/**
* 中国台湾移动电话号码
*/
static readonly REG_MOBILE_TW = "^(?:0|886|\\+886)?(?:|-)09\\d{8}$";
/**
* 中国澳门移动电话号码
*/
static readonly REG_MOBILE_MO = "^(?:0|853|\\+853)?(?:|-)6\\d{7}$";
/**
* 座机号码
*/
static readonly REG_TEL = "^(010|02\\d|0[3-9]\\d{2})-?(\\d{6,8})$";
/**
* 座机号码 + 400/800 电话
*/
static readonly REG_TEL_400_800 =
"^0\\d{2,3}[\\- ]?[1-9]\\d{6,7}|[48]00[\\- ]?[1-9]\\d{6}$";
/**
* 18 位身份证号码
*/
static readonly REG_CITIZEN_ID =
"^[1-9]\\d{5}[1-2]\\d{3}((0\\d)|(1[0-2]))(([012]\\d)|3[0-1])\\d{3}(\\d|X|x)$";
/**
* 邮编(兼容港澳台)
*/
static readonly REG_ZIP_CODE =
"^(0[1-7]|1[0-356]|2[0-7]|3[0-6]|4[0-7]|5[0-7]|6[0-7]|7[0-5]|8[0-9]|9[0-8])\\d{4}|99907[78]$";
/**
* 生日
*/
static readonly REG_BIRTHDAY =
"^(\\d{2,4})([/\\-.年]?)(\\d{1,2})([/\\-.月]?)(\\d{1,2})日?$";
/**
* URI
* 定义见:https://www.ietf.org/rfc/rfc3986.html#appendix-B
*/
static readonly REG_URI =
"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$";
/**
* URL
*/
static readonly REG_URL =
"^[a-zA-Z]+://[\\w-+&@#/%?=~_|!:,.;]*[\\w-+&@#/%=~_|]$";
/**
* HTTP URL(支持 FTP、File 等协议)
*/
static readonly REG_URL_HTTP =
"^(https?|ftp|file)://[\\w-+&@#/%?=~_|!:,.;]*[\\w-+&@#/%=~_|]$";
/**
* 中文字、英文字母、数字和下划线
*/
static readonly REG_GENERAL_WITH_CHINESE = "^[\u4E00-\u9FFF\\w]+$";
/**
* UUID
*/
static readonly REG_UUID =
"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$";
/**
* 不带横线的 UUID
*/
static readonly REG_UUID_SIMPLE = "^[0-9a-fA-F]{32}$";
/**
* MAC 地址
*/
static readonly REG_MAC_ADDRESS =
"^((?:[a-fA-F0-9]{1,2}[:-]){5}[a-fA-F0-9]{1,2})|0x(\\d{12}).+ETHER$";
/**
* 16 进制字符串
*/
static readonly REG_HEX = "^[a-fA-F0-9]+$";
/**
* 时间格式
*/
static readonly REG_TIME = "^\\d{1,2}:\\d{1,2}(:\\d{1,2})?$";
/**
* 中国车牌号码(兼容新能源车牌)
*/
static readonly REG_PLATE_NUMBER =
"^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[ABCDEFGHJK])|([ABCDEFGHJK]([A-HJ-NP-Z0-9])[0-9]{4})))|" +
"([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领]\\d{3}\\d{1,3}[领])|" +
"([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))$";
/**
* 社会统一信用代码
*/
static readonly REG_CREDIT_CODE =
"^[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}$";
/**
* 车架号(车辆识别代号)
*/
static readonly REG_CAR_VIN =
"^[A-HJ-NPR-Z0-9]{8}[0-9X][A-HJ-NPR-Z0-9]{2}\\d{6}$";
/**
* 驾驶证档案编号(中国驾驶证档案编号)
*/
static readonly REG_CAR_DRIVING_LICENCE = "^[0-9]{12}$";
/**
* 中文姓名
*/
static readonly REG_CHINESE_NAME = "^[\u2E80-\u9FFF·]{2,60}$";
/**
* 匹配表情符号(包括单个和组合表情)
*/
static readonly REG_EMOJI =
"(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])";
/**
* 判断内容是否匹配指定正则
* @param content 待验证的内容
* @param pattern 正则表达式
* @returns 是否匹配
*/
private static isMatch(content: string | null | undefined, pattern: string): boolean {
if (!content) return false;
const regex = new RegExp(pattern);
return regex.test(content);
}
/**
* 判断邮箱格式是否正确
* @param content 邮箱地址
* @returns 是否匹配
*/
static isEmail(content: string): boolean {
return RegexUtil.isMatch(content, RegexUtil.REG_EMAIL);
}
/**
* 判断是否包含表情符号
* @param content 待验证的内容
* @returns 是否包含表情
*/
static containsEmoji(content: string): boolean {
return RegexUtil.isMatch(content, RegexUtil.REG_EMOJI);
}
/**
* 判断电话号码格式是否正确
* @param phone 电话号码
* @returns 是否匹配
*/
static isPhone(phone: string): boolean {
return FormatUtil.isPhone(phone);
}
}