大家好,我是不熬夜崽崽!大家如果觉得看了本文有帮助的话,麻烦给不熬夜崽崽点个三连(点赞、收藏、关注)支持一下哈,大家的支持就是我写作的无限动力。
前言
坦白说,正则表达式可以说是程序员成长道路上必经的一座大山。明明只是几个奇怪的符号,结果总能搞得你怀疑人生:
- 手机号校验写一半,突然发现国内三网段更新了;
- 邮箱校验写到怀疑自己是不是语法不对;
- 提取内容写错分组,结果啥也没提取出来;
- 替换内容结果全局和单次搞混了……
我以前也是。直到有一天,我决定封装出属于自己的 RegexUtils 正则工具类。自此,正则再也不是我的心魔,而是我的工具人。
🎯 一、功能全览 —— 我到底要封装哪些正则功能?
RegexUtils 工具类核心能力清单:
功能 | 说明 |
---|---|
✅ 正则校验 | 手机号、邮箱、身份证、IP、密码强度 |
✅ 提取内容 | 提取匹配的第一个/全部内容 |
✅ 替换内容 | 支持单次/全局替换 |
✅ 通配符匹配 | 模拟通配符 * ? 匹配路径 |
别怕复杂,做完这套,你的正则能力就毕业了!
🔧 二、先上完整工具类骨架
public class RegexUtils {
// 预定义常用正则表达式
public static final String REGEX_MOBILE = ^1[3-9]\\d{9}$;
public static final String REGEX_EMAIL = ^[A-Za-z\\d+_.-]+@[A-Za-z\\d.-]+$;
public static final String REGEX_IP = ^((25[0-5]|2[0-4]\\d|[01]?\\d{1,2})\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d{1,2})$;
public static final String REGEX_PASSWORD = ^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d!@#$%^&*()_+]{6,20}$;
private RegexUtils() {}
// 正则校验
public static boolean isMatch(String regex, CharSequence input) {
return input != null && Pattern.matches(regex, input);
}
// 校验手机号
public static boolean isMobile(CharSequence input) {
return isMatch(REGEX_MOBILE, input);
}
// 校验邮箱
public static boolean isEmail(CharSequence input) {
return isMatch(REGEX_EMAIL, input);
}
// 提取第一个匹配内容
public static String extractFirst(String regex, String content) {
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(content);
return matcher.find() ? matcher.group() : null;
}
// 提取所有匹配内容
public static List<String> extractAll(String regex, String content) {
List<String> results = new ArrayList<>();
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
results.add(matcher.group());
}
return results;
}
// 替换内容(全部)
public static String replaceAll(String regex, String replacement, String content) {
return content.replaceAll(regex, replacement);
}
// 替换内容(首次)
public static String replaceFirst(String regex, String replacement, String content) {
return content.replaceFirst(regex, replacement);
}
// 通配符匹配(支持 * ?)
public static boolean wildcardMatch(String pattern, String str) {
String regex = pattern.replace(., \\.)
.replace(*, .*)
.replace(?, .);
return Pattern.matches(regex, str);
}
}
是不是一眼看过去就觉得特别像 正则瑞士军刀?
✅ 三、实战演示:每个功能都举个栗子
1️⃣ 正则校验
System.out.println(RegexUtils.isMobile(13812345678)); // true
System.out.println(RegexUtils.isEmail(abc123@qq.com)); // true
System.out.println(RegexUtils.isMatch(\\d{6}, 123456)); // true
2️⃣ 提取匹配内容
String text = 订单号:NO202306123456;
String orderNo = RegexUtils.extractFirst(NO\\d+, text);
System.out.println(orderNo); // NO202306123456
String multiText = 手机号:13811112222, 13933334444;
List<String> phones = RegexUtils.extractAll(1[3-9]\\d{9}, multiText);
System.out.println(phones); // [13811112222, 13933334444]
3️⃣ 替换内容
String msg = 账号123456已冻结,请联系123456客服。;
String result = RegexUtils.replaceAll(\\d{6}, ******, msg);
System.out.println(result);
// 账号******已冻结,请联系******客服。
4️⃣ 通配符匹配
System.out.println(RegexUtils.wildcardMatch(file-*.txt, file-2023.txt)); // true
System.out.println(RegexUtils.wildcardMatch(data-??.csv, data-01.csv)); // true
🚀 四、进阶扩展建议
如果你希望让 RegexUtils
更加硬核:
扩展方向 | 建议 |
---|---|
✅ 缓存 Pattern | 防止频繁编译,提升性能 |
✅ 支持分组提取 | matcher.group(n) |
✅ 多线程安全 | 让工具类无状态化 |
✅ 国际手机号 | 增加 +86 、+1 规则 |
例如:Pattern 缓存优化
private static final Map<String, Pattern> patternCache = new ConcurrentHashMap<>();
private static Pattern getPattern(String regex) {
return patternCache.computeIfAbsent(regex, Pattern::compile);
}
每次匹配时调用 getPattern()
,性能直接拉满。
💡 五、总结感悟
RegexUtils = 你永远的正则保姆
- 想校验?一行代码搞定 ✅
- 想提取?封装好了直接用 ✅
- 想替换?不用再写复杂
Matcher
✅ - 想匹配通配符?支持 ✅
当我把 RegexUtils
封装好放进我的工具包时,项目里的各种表单校验、文本提取、路径匹配一下子变得优雅又稳定。从此正则表达式只是工具,不再是噩梦。