一文详解Java正则表达式中的捕获组和反向引用功能

 更新时间:2026年06月26日 09:23:21   作者:yaoxin521123  
这篇文章详细讲解了正则表达式中的捕获组和Backreferences)的概念和用法,包括捕获组的编号规则和反向引用的使用方法,以及非捕获组的使用场景,通过示例代码帮助加深理解,需要的朋友可以参考下

大家好 ,今天我们继续深入学习正则表达式,重点是 捕获组 (Capturing Groups)反向引用 (Backreferences)

1. 什么是捕获组?

捕获组的作用:
把一串字符 当作一个整体 来处理。

写法:用 () 括起来。

(dog)

这就表示一个组,包含 "dog" 三个字符。

匹配时,Java 会把这个组匹配到的内容保存起来,方便后面通过 反向引用 重新使用。

2. 捕获组的编号规则

捕获组是从 左到右 数开括号 ( 的顺序来编号的。

例如:

((A)(B(C)))

这里有 4 个捕获组:
1️⃣ ((A)(B(C))) → 最外层大括号
2️⃣ (A)
3️⃣ (B(C))
4️⃣ (C)

在 Java 中如何查看捕获组?

Matcher 提供了一些方法:

matcher.groupCount();   // 捕获组的总数(不包括 group 0)
matcher.group(0);       // 整个正则匹配到的内容
matcher.group(1);       // 第1个捕获组
matcher.start(1);       // 捕获组1的起始位置
matcher.end(1);         // 捕获组1的结束位置

注意

  • group(0) → 总是代表整个正则表达式的匹配结果
  • group(1) ~ group(n) → 依次代表括号里的捕获组

示例

import java.util.regex.*;

public class CapturingGroupsDemo {
    public static void main(String[] args) {
        String input = "abc123xyz";
        String regex = "(abc)(\\d+)(xyz)";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);

        if (matcher.find()) {
            System.out.println("Group count = " + matcher.groupCount()); 
            System.out.println("Group 0 = " + matcher.group(0)); // abc123xyz
            System.out.println("Group 1 = " + matcher.group(1)); // abc
            System.out.println("Group 2 = " + matcher.group(2)); // 123
            System.out.println("Group 3 = " + matcher.group(3)); // xyz
        }
    }
}

运行结果:

Group count = 3
Group 0 = abc123xyz
Group 1 = abc
Group 2 = 123
Group 3 = xyz

3. 反向引用 (Backreferences)

捕获组匹配的内容会被保存,之后可以通过 \1, \2 … 来引用。

  • \1 → 引用第1个捕获组
  • \2 → 引用第2个捕获组
  • 依此类推

示例 1:匹配连续重复的数字

(\d\d)\1

含义:

  • (\d\d) → 匹配两个数字(第1组)
  • \1 → 再次匹配刚刚捕获到的两个数字

测试:

输入:1212   ✅ 匹配
输入:1234   ❌ 不匹配

示例 2:匹配相同单词

(\w+)\s\1

含义:

  • (\w+) → 匹配一个单词(第1组)
  • \s → 匹配一个空格
  • \1 → 再匹配前面那个单词

测试:

输入:hello hello   ✅ 匹配
输入:hello world   ❌ 不匹配

示例 3:嵌套组也能反向引用

(A(B(C)))
  • group(1) = ABC
  • group(2) = BC
  • group(3) = C

如果写 (A(B(C)))\2
→ 先匹配 "ABC",然后再匹配 "BC"

4. 非捕获组 (Non-Capturing Groups)

有时候我们只想用括号分组,但不想保存内容,这时可以用:

(?:...)

示例:

(?:dog|cat){2}

表示 "dog""cat",重复两次,但不会保存组内容。

5. 小结

  • () → 捕获组,自动编号
  • group(0) → 整体匹配
  • group(n) → 第 n 个捕获组
  • \n → 反向引用第 n 个捕获组
  • (?:...) → 非捕获组

以上就是Java正则表达式中的捕获组和反向引用功能的详细内容,更多关于Java正则表达式捕获组和反向引用的资料请关注脚本之家其它相关文章!

相关文章

  • springboot中关于classpath:路径使用及说明

    springboot中关于classpath:路径使用及说明

    这篇文章主要介绍了springboot中关于classpath:路径使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • SpringCloud Feign远程调用与自定义配置详解

    SpringCloud Feign远程调用与自定义配置详解

    Feign是Netflix公司开发的一个声明式的REST调用客户端; Ribbon负载均衡、 Hystrⅸ服务熔断是我们Spring Cloud中进行微服务开发非常基础的组件,在使用的过程中我们也发现它们一般都是同时出现的,而且配置也都非常相似
    2022-11-11
  • Java中HashMap和Hashtable及HashSet的区别

    Java中HashMap和Hashtable及HashSet的区别

    以下是对Java中HashMap和Hashtable及HashSet的区别进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-09-09
  • java求整数的位数方式

    java求整数的位数方式

    这篇文章主要介绍了java求整数的位数方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • jdk动态代理和cglib动态代理详解

    jdk动态代理和cglib动态代理详解

    本篇文章主要介绍了深度剖析java中JDK动态代理机制 ,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象
    2021-07-07
  • Java中静态代码块、构造代码块、构造函数和普通代码块的区别

    Java中静态代码块、构造代码块、构造函数和普通代码块的区别

    在Java中,静态代码块、构造代码块、构造函数、普通代码块的执行顺序是一个笔试的考点,通过这篇文章希望大家能彻底了解它们之间的执行顺序,需要的朋友可以参考下
    2023-05-05
  • IDEA中Directory创建多级目录的实现

    IDEA中Directory创建多级目录的实现

    本文主要介绍了IDEA中Directory创建多级目录的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Spring Cloud Ribbon实现客户端负载均衡的方法

    Spring Cloud Ribbon实现客户端负载均衡的方法

    本篇文章主要介绍了Spring Cloud Ribbon实现客户端负载均衡的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • JAVA自定义注解实现接口/ip限流的示例代码

    JAVA自定义注解实现接口/ip限流的示例代码

    本文主要介绍了JAVA自定义注解实现接口/ip限流的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Java利用Map实现计算文本中字符个数

    Java利用Map实现计算文本中字符个数

    这篇文章主要为大家详细介绍了Java如何利用Map集合实现计算文本中字符个数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-08-08

最新评论