0
点赞
收藏
分享

微信扫一扫

Java(day163):你还在手写正则校验?RegexUtils 工具类才是你写正则的终极归宿!

大家好,我是不熬夜崽崽!大家如果觉得看了本文有帮助的话,麻烦给不熬夜崽崽点个三连(点赞、收藏、关注)支持一下哈,大家的支持就是我写作的无限动力。

前言

  坦白说,正则表达式可以说是程序员成长道路上必经的一座大山。明明只是几个奇怪的符号,结果总能搞得你怀疑人生:

  • 手机号校验写一半,突然发现国内三网段更新了;
  • 邮箱校验写到怀疑自己是不是语法不对;
  • 提取内容写错分组,结果啥也没提取出来;
  • 替换内容结果全局和单次搞混了……

  我以前也是。直到有一天,我决定封装出属于自己的 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 封装好放进我的工具包时,项目里的各种表单校验、文本提取、路径匹配一下子变得优雅又稳定。从此正则表达式只是工具,不再是噩梦。

举报

相关推荐

0 条评论