温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java正则怎么使用分组

发布时间:2026-07-24 07:05:24 来源:亿速云 阅读:108 作者:小樊 栏目:编程语言

在 Java 中,**正则分组(Group)**是通过 小括号 () 来实现的,配合 java.util.regex 包中的 Pattern 和 Matcher 使用。下面从基础到常见用法系统讲一下。


一、什么是分组

分组就是把正则表达式的一部分括起来,表示一个“子表达式”,可以:

  • 单独捕获匹配内容
  • 进行重复、选择等操作
  • 后续引用(反向引用)

示例:

(\d{4})-(\d{2})-(\d{2})

这里有 3 个分组:

  • 第 1 组:年
  • 第 2 组:月
  • 第 3 组:日

二、基本使用步骤

1️⃣ 编译正则

Pattern pattern = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})");

2️⃣ 创建 Matcher

Matcher matcher = pattern.matcher("日期是 2024-01-21 和 2023-12-31");

3️⃣ 查找并获取分组

while (matcher.find()) {
    System.out.println("整体匹配:" + matcher.group(0));
    System.out.println("年:" + matcher.group(1));
    System.out.println("月:" + matcher.group(2));
    System.out.println("日:" + matcher.group(3));
}

输出:

整体匹配:2024-01-21
年:2024
月:01
日:21

三、分组编号规则

写法 含义
group(0) 整个正则匹配的内容
group(1) 第 1 个 ()
group(2) 第 2 个 ()
… 以此类推

⚠️ 从左到右、从外到内 数括号


四、命名分组(Java 7+ ✅ 推荐)

1️⃣ 定义命名分组

(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})

2️⃣ 使用方式

Pattern pattern = Pattern.compile("(?<year>\\d{4})-(?<month>\\d{2})-(?<day>\\d{2})");
Matcher matcher = pattern.matcher("2024-01-21");

if (matcher.find()) {
    System.out.println(matcher.group("year"));
    System.out.println(matcher.group("month"));
    System.out.println(matcher.group("day"));
}

✅ 可读性强,避免数括号


五、非捕获分组 (?:)

如果你只想分组但不想捕获:

(?:\d{4})-(\d{2})-(\d{2})

此时:

  • (?:\d{4}) 不参与分组编号
  • 只有 (\d{2}) 是 group(1)

✅ 常用于性能优化或逻辑分组


六、反向引用分组

1️⃣ 正则中引用

(\d)\1

表示:同一个数字重复两次

示例:

Pattern.compile("(\\d)\\1").matcher("11 22 33").find();

2️⃣ 命名分组反向引用

(?<num>\d)\k<num>

七、常见示例

✅ 提取 URL 中的参数

String regex = "(?<key>[^=]+)=(?<value>[^&]+)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher("a=1&b=2");

while (matcher.find()) {
    System.out.println(matcher.group("key") + " => " + matcher.group("value"));
}

✅ 校验并提取手机号

Pattern pattern = Pattern.compile("1([3-9])\\d{9}");
Matcher matcher = pattern.matcher("手机号是13800000000");

if (matcher.find()) {
    System.out.println(matcher.group(0));
}

八、常见坑

❌ 忘记转义反斜杠

"\\d"  // 正确
"\d"   // 错误

❌ group() 前没调用 find() / matches()

❌ 混淆 group(0) 和 group(1)


九、总结

功能 写法
普通分组 (abc)
命名分组 (?<name>abc)
非捕获分组 (?:abc)
反向引用 \1 或 \k<name>
获取分组 matcher.group(n)

如果你有具体场景(比如解析日志、校验密码、提取 HTML),可以直接贴出来,我可以帮你写完整正则和 Java 代码。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手