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);}
}
代碼如下:
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);}
}