系列中的上一篇
当前教程
捕获组
系列中的下一篇

系列中的上一篇: 量词

系列中的下一篇: 边界

捕获组

 

捕获组

在上一节中,您了解了量词如何一次附加到一个字符、字符类或捕获组。但到目前为止,我们还没有详细讨论捕获组的概念。

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

 

编号

Pattern API 中所述,捕获组的编号是通过从左到右计算其开括号来确定的。例如,在表达式 ((A)(B(C))) 中,有四个这样的组

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

要找出表达式中存在多少个组,请在 matcher 对象上调用 groupCount() 方法。 groupCount() 方法返回一个 int,表示匹配器模式中存在的捕获组数量。在本例中,groupCount() 将返回数字 4,表示该模式包含 4 个捕获组。

还有一个特殊的组,组 0,它始终代表整个表达式。该组不包含在 groupCount() 报告的总数中。以 (? 开头的组是纯的、非捕获组,它们不捕获文本,也不计入组总数。您将在“模式类的使用方法”部分中看到非捕获组的示例。

了解组的编号方式非常重要,因为某些 Matcher 方法接受一个 int 作为参数,该参数指定特定的组号

 

反向引用

与捕获组匹配的输入字符串部分将保存在内存中,以便稍后通过反向引用进行调用。反向引用在正则表达式中指定为反斜杠 (\) 后跟一个数字,该数字指示要调用的组的编号。例如,表达式 (\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 日


系列中的上一篇
当前教程
捕获组
系列中的下一篇

系列中的上一篇: 量词

系列中的下一篇: 边界