文档

Java™ 教程
隐藏目录
捕获组
路径: 基本的Java类
课程: 正则表达式

捕获组

前一节中,我们看到量词一次只能应用于一个字符、字符类或捕获组。但是直到现在,我们还没有详细讨论捕获组的概念。

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

编号

正如Pattern API中所描述的那样,捕获组是通过从左到右计算其开括号的数量进行编号的。例如,在表达式((A)(B(C)))中,有四个这样的组:

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

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

还有一个特殊的组,组0,它始终表示整个表达式。这个组不包括在groupCount报告的总数中。以(?开头的组是纯粹的,非捕获组,它们不捕获文本,并且不计入组总数。(您将在后面的Pattern类的方法部分看到非捕获组的示例。)

了解如何对组进行编号非常重要,因为一些Matcher方法接受一个int作为参数,指定特定的组号:

回溯引用

匹配捕获组的输入字符串部分会被保存在内存中,以便以后通过回溯引用进行调用。回溯引用在正则表达式中由反斜杠 (\) 后面跟着一个数字来指定要调用的组的编号。例如,表达式 (\d\d) 定义了一个捕获组,用于匹配两个连续的数字,并且可以在表达式中通过回溯引用 \1 进行调用。

要匹配任意2个数字,后面跟着相同的两个数字,可以使用 (\d\d)\1 作为正则表达式:

 
输入你的正则表达式:(\d\d)\1
输入要搜索的字符串:1212
我找到了文本 "1212",起始索引为 0,结束索引为 4。

如果你改变最后两个数字,匹配将失败:

 
输入你的正则表达式:(\d\d)\1
输入要搜索的字符串:1234
未找到匹配项。

对于嵌套的捕获组,回溯引用的工作方式完全相同:指定一个反斜杠后面跟着要调用的组的编号。


上一页: 量词
下一页: 边界匹配器