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,它们将特定的组号指定为参数:

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组,反引用的工作方式完全相同:指定反斜杠,后跟要调用的组的编号。