温馨提示×

温馨提示×

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

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

java regex如何捕获分组

发布时间:2026-10-04 21:44:19 来源:亿速云 阅读:98 作者:小樊 栏目:编程语言

在 Java 中,使用 正则表达式捕获分组 主要依赖 java.util.regex 包里的 Pattern 和 Matcher 类。下面从基础到进阶给你讲清楚。


一、什么是“捕获分组”

用 小括号 () 括起来的部分就是“捕获分组”,
正则匹配成功后,可以单独拿到每一组的内容。

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

上面有 3 个捕获分组:

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

二、最基础的用法(Matcher.group)

示例:提取日期

import java.util.regex.*;

public class Test {
    public static void main(String[] args) {
        String text = "今天是 2024-01-15,明天是 2024-01-16";

        String regex = "(\\d{4})-(\\d{2})-(\\d{2})";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(text);

        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-15
年: 2024
月: 01
日: 15

✅ group(0) 永远是整个匹配
✅ group(n) 是第 n 个捕获分组


三、给分组命名(推荐 ✅)

Java 7+ 支持 命名捕获分组

语法

(?<name>...)

示例

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

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

✅ 可读性更好
✅ 不怕分组顺序变化


四、不捕获分组(仅分组,不捕获)

有时候你只是想“分组”,但 不想捕获:

(?:abc)+
String regex = "(?:\\d{4})-(\\d{2})";
  • (?:...):非捕获分组
  • group(1) 只匹配月份

五、多个匹配 + 分组示例

String text = "a=1; b=2; c=3";
String regex = "(\\w+)=(\\d+)";

Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(text);

while (m.find()) {
    System.out.println(m.group(1) + " => " + m.group(2));
}

输出:

a => 1
b => 2
c => 3

六、常见易错点

1️⃣ 忘记调用 find() / matches()

  • find():查找子串
  • matches():整个字符串必须匹配

2️⃣ 转义反斜杠

Java 字符串中:

"\\d"  // 正则里的 \d

3️⃣ 分组数量对不上

matcher.group(5); // 如果没有第5组会抛异常

七、总结

功能 写法
捕获分组 (...)
命名分组 (?<name>...)
非捕获分组 (?:...)
获取分组 matcher.group(n)
获取命名分组 matcher.group("name")

如果你有 具体场景(比如解析日志、URL、JSON 片段、邮箱等),可以把字符串和想要的结果发出来,我可以帮你写正则。

向AI问一下细节

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

AI
助
手