# 捕获群组

> 原文： [https://docs.oracle.com/javase/tutorial/essential/regex/groups.html](https://docs.oracle.com/javase/tutorial/essential/regex/groups.html)

在[上一节](quant.html)中，我们看到量词一次如何附加到一个字符，字符类或捕获组。但到目前为止，我们还没有详细讨论过捕捉群体的概念。

_ 捕获组 _ 是一种将多个字符视为一个单元的方法。它们是通过将要分组的字符放在一组括号中来创建的。例如，正则表达式`(dog)`创建一个包含字母`"d" "o"`和`"g"`的组。与捕获组匹配的输入字符串部分将保存在内存中，以便以后通过反向引用进行调用（如下面的 [Backreferences](#backref) 部分所述）。

## 编号

如 [`Pattern`](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html) API 中所述，捕获组通过从左到右计算它们的左括号来编号。例如，在表达式`((A)(B(C)))`中，有四个这样的组：

1.  `((A)(B(C)))`
2.  `(A)`
3.  `(B(C))`
4.  `(C)`

要查找表达式中存在多少个组，请在匹配器对象上调用`groupCount`方法。 `groupCount`方法返回`int`，显示匹配器模式中存在的捕获组数。在此示例中，`groupCount`将返回数字`4`，表明该模式包含 4 个捕获组。

还有一个特殊组，即组 0，它始终代表整个表达式。该组不包括在`groupCount`报告的总数中。以`(?`开头的组是纯的 _ 非捕获组 _，它们不捕获文本而不计入组总数。 （您将在[模式类](pattern.html)的方法部分中看到非捕获组的示例。）

了解组的编号非常重要，因为某些`Matcher`方法接受`int`指定特定组编号作为参数：

*   [`public int start(int group)`](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Matcher.html#start-int-) ：返回上一个匹配操作期间给定组捕获的子序列的起始索引。
*   [`public int end (int group)`](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Matcher.html#end-int-) ：返回上一个匹配操作期间给定组捕获的子序列的最后一个字符的索引加 1。
*   [`public String group (int group)`](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Matcher.html#group-int-) ：返回上一个匹配操作期间给定组捕获的输入子序列。

## 反向引用

与捕获组匹配的输入字符串部分保存在内存中，以便以后通过 _ 反向引用 _ 进行调用。在正则表达式中将反向引用指定为反斜杠（`\`），后跟一个指示要调用的组的编号的数字。例如，表达式`(\d\d)`定义一个匹配行中两个数字的捕获组，可以通过反向引用`\1`在表达式中稍后调用。

要匹配任何 2 位数字，后跟完全相同的两位数字，您可以使用`(\d\d)\1`作为正则表达式：

```

Enter your regex: (\d\d)\1
Enter input string to search: 1212
I found the text "1212" starting at index 0 and ending at index 4.

```

如果更改最后两位数，则匹配将失败：

```

Enter your regex: (\d\d)\1
Enter input string to search: 1234
No match found.

```

对于嵌套捕获组，反向引用的工作方式完全相同：指定反斜杠后跟要调用的组的编号。