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 条评论