Capturing Groups
在previous section中,我们看到了量词如何一次附加到一个字符,一个字符类或一个catch组。但是直到现在,我们还没有详细讨论catch组的概念。
catch组是一种将多个字符视为一个单元的方法。通过将要分组的字符放在一组括号内来创建它们。例如,正则表达式(dog)
创建包含字母"d" "o"
和"g"
的单个组。Importing 字符串 中与catch组匹配的部分将保存在内存中,以供以后通过反向引用调用(如以下在Backreferences部分中所述)。
Numbering
如Pattern API 中所述,catch组的编号是通过从左到右计算其开括号来进行的。例如,在表达式((A)(B(C)))
中,有四个这样的组:
-
((A)(B(C)))
-
(A)
-
(B(C))
-
(C)
要找出表达式中有多少个组,请在匹配器对象上调用groupCount
方法。 groupCount
方法返回int
,表示匹配器 Pattern 中存在的catch组数。在此示例中,groupCount
将返回数字4
,表明该 Pattern 包含 4 个catch组。
还有一个特殊的组,组 0,它始终代表整个表达式。该组未包含在groupCount
报告的总数中。以(?
开头的组是纯非catch组,它们不catch文本,也不计入组总数。 (您稍后会在Pattern 类的方法部分中看到非catch组的示例。)
了解组的编号方式很重要,因为某些Matcher
方法接受int
,它们将特定的组号指定为参数:
-
public int start(int 组):返回在上一次匹配操作期间给定组catch的子序列的起始索引。
-
public int end(int 组):返回给定组在上一次匹配操作期间catch的最后一个字符的索引加一个。
-
公共字符串 组(int 组):返回在上一次匹配操作期间给定组catch的 Importing 子序列。
Backreferences
Importing 字符串 中与catch组匹配的部分将保存在内存中,以供以后通过反向引用调用。反引用在正则表达式中指定为反斜杠(\
),后跟一个数字,该数字指示要调用的组的编号。例如,表达式(\d\d)
定义了一个与行中的两位数字匹配的catch组,可以稍后在该表达式中通过向后引用\1
调用该catch组。
要匹配任意 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.
对于嵌套catch组,反引用的工作方式完全相同:指定反斜杠,后跟要调用的组的编号。