java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java正则表达式捕获组和反向引用

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

作者: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的结束位置

注意

示例

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:匹配连续重复的数字

(\d\d)\1

含义:

测试:

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

示例 2:匹配相同单词

(\w+)\s\1

含义:

测试:

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

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

(A(B(C)))

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

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

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

(?:...)

示例:

(?:dog|cat){2}

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

5. 小结

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

您可能感兴趣的文章:
阅读全文