捕获组
捕获组
在上一节中,您了解了量词如何一次附加到一个字符、字符类或捕获组。但到目前为止,我们还没有详细讨论捕获组的概念。
捕获组是一种将多个字符视为单个单元的方法。它们是通过将要分组的字符放在一对括号内来创建的。例如,正则表达式 (dog)
创建一个包含字母 "d" "o" 和 "g" 的单个组。与捕获组匹配的输入字符串部分将保存在内存中,以便稍后通过反向引用进行调用(如下面的部分 反向引用 中所述)。
编号
如 Pattern API 中所述,捕获组的编号是通过从左到右计算其开括号来确定的。例如,在表达式 ((A)(B(C)))
中,有四个这样的组
((A)(B(C)))
(A)
(B(C))
(C)
要找出表达式中存在多少个组,请在 matcher
对象上调用 groupCount()
方法。 groupCount()
方法返回一个 int
,表示匹配器模式中存在的捕获组数量。在本例中,groupCount()
将返回数字 4,表示该模式包含 4 个捕获组。
还有一个特殊的组,组 0,它始终代表整个表达式。该组不包含在 groupCount()
报告的总数中。以 (?
开头的组是纯的、非捕获组,它们不捕获文本,也不计入组总数。您将在“模式类的使用方法”部分中看到非捕获组的示例。
了解组的编号方式非常重要,因为某些 Matcher
方法接受一个 int
作为参数,该参数指定特定的组号
public int start(int group)
): 返回在先前匹配操作期间由给定组捕获的子序列的起始索引。public int end(int group)
: 返回在先前匹配操作期间由给定组捕获的子序列的最后一个字符的索引加一。public String group(int group)
: 返回在先前匹配操作期间由给定组捕获的输入子序列。
反向引用
与捕获组匹配的输入字符串部分将保存在内存中,以便稍后通过反向引用进行调用。反向引用在正则表达式中指定为反斜杠 (\
) 后跟一个数字,该数字指示要调用的组的编号。例如,表达式 (\d\d)
定义一个捕获组,该组匹配连续的两位数字,稍后可以通过反向引用 \1
在表达式中进行调用。
要匹配任何两位数字,然后是完全相同的两位数字,您将使用 (\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.
对于嵌套的捕获组,反向引用以完全相同的方式工作:指定反斜杠后跟要调用的组的编号。
上次更新: 2022 年 1 月 10 日