RegexPool 正则表达式池
# 1. 功能概述
RegexPool 是 Hutool 提供的常用正则表达式字符串池,定义了大量常用的正则表达式常量,方便开发者直接使用,无需手动编写复杂的正则表达式。该接口包含了从基础的数字、字母匹配到复杂的邮箱、身份证、车牌等多种常用正则表达式。
# 2. 常量列表
# 2.1 基础类型
| 常量名 | 正则表达式 | 描述 |
|---|---|---|
| GENERAL | ^\\w+$ | 英文字母、数字和下划线 |
| NUMBERS | \\d+ | 数字 |
| WORD | [a-zA-Z]+ | 字母 |
| 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] | 单个中文汉字 |
| CHINESES | CHINESE + "+" | 中文汉字 |
| GROUP_VAR | \\$(\\d+) | 分组 |
# 2.2 网络相关
| 常量名 | 正则表达式 | 描述 |
|---|---|---|
| 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)$ | IP v4 |
| 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])) | IP v6 |
| URI | ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))? | URI |
| URL | [a-zA-Z]+://[\\w-+&@#/%?=~_|!:,.;]*[\\w-+&@#/%=~_|] | URL |
| URL_HTTP | (https?|ftp|file)://[\\w-+&@#/%?=~_|!:,.;]*[\\w-+&@#/%=~_|] | Http URL |
# 2.3 联系信息
| 常量名 | 正则表达式 | 描述 |
|---|---|---|
(?:[a-z0-9\\u4e00-\\u9fa5!#$%&'*+/=?^_{ | }~-]+(?:\.[a-z0-9\u4e00-\u9fa5!#$%&'*+/=?^_{|}~-]+)*|"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*")@(?:(?:[a-z0-9\\u4e00-\\u9fa5](?:[a-z0-9\\u4e00-\\u9fa5-]*[a-z0-9\\u4e00-\\u9fa5])?\\.)+[a-z0-9\\u4e00-\\u9fa5](?:[a-z0-9\\u4e00-\\u9fa5-]*[a-z0-9\\u4e00-\\u9fa5])?|\\[(?:(?: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\\u4e00-\\u9fa5-]*[a-z0-9\\u4e00-\\u9fa5]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)]) | |
| MOBILE | (?:0|86|\\+86)?1[3-9]\\d{9} | 中国大陆移动电话 |
| MOBILE_HK | (?:0|852|\\+852)?\\d{8} | 中国香港移动电话 |
| MOBILE_TW | (?:0|886|\\+886)?(?:|-)09\\d{8} | 中国台湾移动电话 |
| MOBILE_MO | (?:0|853|\\+853)?(?:|-)6\\d{7} | 中国澳门移动电话 |
| TEL | (010|02\\d|0[3-9]\\d{2})-?(\\d{6,8}) | 座机号码 |
| TEL_400_800 | 0\\d{2,3}[\\- ]?[0-9]\\d{6,7}|[48]00[\\- ]?[0-9]\\d{2}[\\- ]?\\d{4} | 座机号码+400+800电话 |
# 2.4 证件相关
| 常量名 | 正则表达式 | 描述 |
|---|---|---|
| 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) | 18位身份证号码 |
| 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]$ | 邮编,兼容港澳台 |
| CREDIT_CODE | ^[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}$ | 统一社会信用代码 |
| CAR_VIN | ^[A-HJ-NPR-Z0-9]{8}[X0-9]([A-HJ-NPR-Z0-9]{3}\\d{5}|[A-HJ-NPR-Z0-9]{5}\\d{3})$ | 车架号(车辆识别代号) |
| CAR_DRIVING_LICENCE | ^[0-9]{12}$ | 驾驶证档案编号 |
# 2.5 其他
| 常量名 | 正则表达式 | 描述 |
|---|---|---|
| MONEY | ^(\\d+(?:\\.\\d+)?)$ | 货币 |
| BIRTHDAY | ^(\\d{2,4})([/\\-.年]?)(\\d{1,2})([/\\-.月]?)(\\d{1,2})日?$ | 生日 |
| GENERAL_WITH_CHINESE | ^[\\u4E00-\\u9FFF\\w]+$ | 中文字、英文字母、数字和下划线 |
| UUID | ^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$ | UUID |
| UUID_SIMPLE | ^[0-9a-fA-F]{32}$ | 不带横线的UUID |
| MAC_ADDRESS | ((?:[a-fA-F0-9]{1,2}[:-]){5}[a-fA-F0-9]{1,2})|((?:[a-fA-F0-9]{1,4}[.]){2}[a-fA-F0-9]{1,4})|[a-fA-F0-9]{12}|0x(\\d{12}).+ETHER | MAC地址 |
| HEX | ^[a-fA-F0-9]+$ | 16进制字符串 |
| TIME | \\d{1,2}[:时]\\d{1,2}([:分]\\d{1,2})?秒? | 时间 |
| 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挂学警港澳使领]))$ | 中国车牌号码(兼容新能源车牌) |
| CHINESE_NAME | ^[\\u3400-\\u9FFF·]{2,60}$ | 中文姓名(支持维吾尔族姓名中的点) |
# 3. 详细说明
# 3.1 基础类型
# GENERAL
- 功能:匹配英文字母、数字和下划线
- 格式:
^\w+$ - 说明:
\w等价于[a-zA-Z0-9_],匹配任何字母、数字或下划线
# NUMBERS
- 功能:匹配数字
- 格式:
\d+ - 说明:
\d等价于[0-9],匹配任何数字,+表示匹配一个或多个
# WORD
- 功能:匹配字母
- 格式:
[a-zA-Z]+ - 说明:匹配任何大小写字母,
+表示匹配一个或多个
# CHINESE
- 功能:匹配单个中文汉字
- 格式:包含多个Unicode范围的复杂正则表达式
- 说明:参照维基百科汉字Unicode范围,覆盖了常用的中文字符
# CHINESES
- 功能:匹配中文汉字
- 格式:
CHINESE + "+" - 说明:复用了 CHINESE 常量,
+表示匹配一个或多个中文汉字
# 3.2 网络相关
# IPV4
- 功能:匹配IP v4地址
- 格式:
^(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)$ - 说明:采用分组方式,确保每个段的数值在0-255之间
# URL_HTTP
- 功能:匹配HTTP、FTP、File等协议的URL
- 格式:
(https?|ftp|file)://[\w-+&@#/%?=~_|!:,.;]*[\w-+&@#/%=~_|] - 说明:支持http、https、ftp和file协议
# 3.3 联系信息
- 功能:匹配电子邮件地址
- 格式:符合RFC 5322规范的复杂正则表达式
- 说明:支持中文邮箱、带特殊字符的邮箱等多种格式
# MOBILE
- 功能:匹配中国大陆移动电话
- 格式:
(?:0|86|\+86)?1[3-9]\d{9} - 说明:支持带国际区号或不带区号的手机号码,号码以13-19开头
# 3.4 证件相关
# CITIZEN_ID
- 功能:匹配18位身份证号码
- 格式:
[1-9]\d{5}[1-2]\d{3}((0\d)|(1[0-2]))(([012]\d)|3[0-1])\d{3}(\d|X|x) - 说明:包含了地区码、出生日期和校验码的验证
# CREDIT_CODE
- 功能:匹配统一社会信用代码
- 格式:
^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$ - 说明:符合统一社会信用代码的编码规则
# 3.5 其他
# UUID
- 功能:匹配UUID格式
- 格式:
^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$ - 说明:匹配标准的带横线的UUID格式
# PLATE_NUMBER
- 功能:匹配中国车牌号码
- 格式:支持普通车牌和新能源车牌的复杂正则表达式
- 说明:兼容新能源车牌的特殊格式
# CHINESE_NAME
- 功能:匹配中文姓名
- 格式:
^[\u3400-\u9FFF·]{2,60}$ - 说明:支持维吾尔族姓名中的点(·),长度限制为2-60位
# 4. 使用示例
# 4.1 基本使用
import cn.hutool.v7.core.regex.RegexPool;
import cn.hutool.v7.core.regex.ReUtil;
// 验证手机号
String mobile = "13812345678";
boolean isMobile = ReUtil.isMatch(RegexPool.MOBILE, mobile);
Console.log("是否为手机号:" + isMobile); // 输出:是否为手机号:true
// 验证邮箱
String email = "test@example.com";
boolean isEmail = ReUtil.isMatch(RegexPool.EMAIL, email);
Console.log("是否为邮箱:" + isEmail); // 输出:是否为邮箱:true
// 验证身份证
String idCard = "110101199001011234";
boolean isIdCard = ReUtil.isMatch(RegexPool.CITIZEN_ID, idCard);
Console.log("是否为身份证:" + isIdCard); // 输出:是否为身份证:true
// 验证IP地址
String ip = "192.168.1.1";
boolean isIp = ReUtil.isMatch(RegexPool.IPV4, ip);
Console.log("是否为IP地址:" + isIp); // 输出:是否为IP地址:true
// 验证URL
String url = "https://www.example.com";
boolean isUrl = ReUtil.isMatch(RegexPool.URL_HTTP, url);
Console.log("是否为URL:" + isUrl); // 输出:是否为URL:true
# 4.2 提取匹配内容
import cn.hutool.v7.core.regex.RegexPool;
import cn.hutool.v7.core.regex.ReUtil;
// 提取手机号
String text = "联系电话:13812345678,备用电话:13987654321";
List<String> mobiles = ReUtil.findAllGroup0(RegexPool.MOBILE, text);
Console.log("提取的手机号:" + mobiles); // 输出:提取的手机号:[13812345678, 13987654321]
// 提取IP地址
String log = "用户登录IP:192.168.1.1,服务器IP:10.0.0.1";
List<String> ips = ReUtil.findAllGroup0(RegexPool.IPV4, log);
Console.log("提取的IP地址:" + ips); // 输出:提取的IP地址:[192.168.1.1, 10.0.0.1]
# 4.3 替换匹配内容
import cn.hutool.v7.core.regex.RegexPool;
import cn.hutool.v7.core.regex.ReUtil;
// 隐藏手机号中间4位
String mobile = "13812345678";
String hiddenMobile = ReUtil.replaceAll(mobile, RegexPool.MOBILE, "$1****$2", 1, 3);
Console.log("隐藏后的手机号:" + hiddenMobile); // 输出:隐藏后的手机号:138****5678
// 隐藏身份证号中间部分
String idCard = "110101199001011234";
String hiddenIdCard = ReUtil.replaceAll(idCard, RegexPool.CITIZEN_ID, "$1********$2", 1, 2);
Console.log("隐藏后的身份证:" + hiddenIdCard); // 输出:隐藏后的身份证:110101********1234
# 5. 注意事项
性能考虑:复杂的正则表达式可能会影响性能,对于大量数据的验证,建议谨慎使用。
匹配精度:正则表达式只能进行格式验证,不能保证内容的真实性。例如,身份证号格式正确但可能是伪造的。
Unicode范围:CHINESE 常量使用了较广的Unicode范围,但仍可能无法覆盖所有罕见的中文字符。
地区差异:部分正则表达式(如手机号、车牌)针对中国地区设计,其他国家或地区可能需要调整。
正则转义:在Java代码中使用这些正则表达式时,注意反斜杠的转义问题。RegexPool中的常量已经处理了转义,但如果手动复制使用,需要确保转义正确。
邮箱验证:EMAIL 常量采用了较为宽松的验证规则,符合RFC 5322规范,但可能会允许一些特殊格式的邮箱。
车牌验证:PLATE_NUMBER 常量已经兼容新能源车牌,但随着车牌政策的变化,可能需要更新。
边界匹配:大多数正则表达式使用了
^和$进行边界匹配,确保整个字符串都符合格式要求。如果只需要匹配字符串的一部分,可能需要移除这些边界符。
# 6. 最佳实践
直接使用常量:优先使用 RegexPool 中定义的常量,避免重复编写正则表达式。
结合 ReUtil:与 Hutool 的 ReUtil 工具类结合使用,简化正则表达式的操作。
自定义扩展:对于特殊业务场景,可以基于 RegexPool 中的常量进行扩展,创建符合特定需求的正则表达式。
测试验证:在使用正则表达式前,建议进行充分的测试,确保其能正确匹配预期的格式。
文档注释:在使用复杂正则表达式的地方,添加注释说明其功能和匹配规则,提高代码可读性。
RegexPool 为开发者提供了丰富的常用正则表达式,大大简化了数据验证和提取的工作。通过合理使用这些常量,可以提高代码的可读性和维护性,同时确保验证逻辑的准确性。