Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
请参阅Java语言更改以了解Java SE 9及其后续版本中的更新语言功能的概述。
请参阅JDK发行说明,了解有关所有JDK版本的新功能、增强功能以及已删除或已弃用选项的信息。
在前一节中,我们看到量词一次只能应用于一个字符、字符类或捕获组。但是直到现在,我们还没有详细讨论捕获组的概念。
捕获组是将多个字符视为单个单元的一种方法。它们是通过将要分组的字符放置在一对括号中创建的。例如,正则表达式(dog)
创建一个包含字母"d" "o"
和"g"
的单个组。与捕获组匹配的输入字符串的部分将保存在内存中,以供以后通过后向引用(在下面的后向引用部分讨论)进行调用。
正如Pattern
API中所描述的那样,捕获组是通过从左到右计算其开括号的数量进行编号的。例如,在表达式((A)(B(C)))
中,有四个这样的组:
((A)(B(C)))
(A)
(B(C))
(C)
要找出表达式中存在多少组,请在匹配器对象上调用groupCount
方法。该groupCount
方法返回一个int
,显示匹配器模式中存在的捕获组数量。在这个例子中,groupCount
将返回数字4
,表示该模式包含4个捕获组。
还有一个特殊的组,组0,它始终表示整个表达式。这个组不包括在groupCount
报告的总数中。以(?
开头的组是纯粹的,非捕获组,它们不捕获文本,并且不计入组总数。(您将在后面的Pattern类的方法部分看到非捕获组的示例。)
了解如何对组进行编号非常重要,因为一些Matcher
方法接受一个int
作为参数,指定特定的组号:
public int start(int group)
:返回上一次匹配操作期间给定组捕获的子序列的起始索引。public int end (int group)
:返回上一次匹配操作期间给定组捕获的子序列的最后一个字符的索引加一。public String group (int group)
:返回上一次匹配操作期间给定组捕获的输入子序列。匹配捕获组的输入字符串部分会被保存在内存中,以便以后通过回溯引用进行调用。回溯引用在正则表达式中由反斜杠 (\
) 后面跟着一个数字来指定要调用的组的编号。例如,表达式 (\d\d)
定义了一个捕获组,用于匹配两个连续的数字,并且可以在表达式中通过回溯引用 \1
进行调用。
要匹配任意2个数字,后面跟着相同的两个数字,可以使用 (\d\d)\1
作为正则表达式:
输入你的正则表达式:(\d\d)\1 输入要搜索的字符串:1212 我找到了文本 "1212",起始索引为 0,结束索引为 4。
如果你改变最后两个数字,匹配将失败:
输入你的正则表达式:(\d\d)\1 输入要搜索的字符串:1234 未找到匹配项。
对于嵌套的捕获组,回溯引用的工作方式完全相同:指定一个反斜杠后面跟着要调用的组的编号。