β

[正则] 捕获组

Aptusource.orgAptusource.org 357 阅读

正则中的捕获组(Capturing Groups)可以将多个字符作为一个整体进行处理。创建方式是将多个字符放入一对小括号中。例如,正则表达式 (dog),表示包含了 d、o、g 三个字符的一个整体。

为什么叫做捕获组,因为它不仅仅会完成匹配的工作,还会将捕获组匹配的字符将会存入内存中方便以后反向引用(反向引用的描述请看下文)。

捕获组计数

在 Pattern API 中描述,计算捕获组的数字是由左边的第一个小括号开始,从左至右计数。因此,表达式 ((A)(B(C))) 中依次有下面的捕获组:

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

要知道表达式中有多少个组,可以调用 matcher 对象的 groupCount 方法。这个方法将返回 int 类型的捕获组数目。上面例子中,调用 groupCount 将会返回 4。

还有一个特殊的捕获组 0,它总是表示整个正则表达式,在调用 getCount 方法的时候,不会对这个捕获组计数。

以 (? 开头的分组称为非捕获组,匹配功能与捕获组一样,但是不会保存捕获数据也不会进行组计数。

对于捕获组是如何进行计数的要非常清楚,因为一些 Matcher 的方法需要使用到这些 int 类型的数字作为参数:

反向引用

将捕获组捕获的部分存入内存,之后可以通过反向引用进行调用。反向引用由一个反斜线开始(\)后跟要调用的捕获组计数。例如,表达式 (\d\d) 定义了一行中匹配两个数字的捕获组,那么之后可以通过 \1 进行反向引用。

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

请输入正则表达式:(\d\d)\1
请输入检索文本:1212
检索到匹配文本"1212"从位置 0 到 4。

如果后面两个数字和前面的不同,则会匹配失败:

请输入正则表达式:(\d\d)\1
请输入检索文本:1234
没有检索到匹配的文本。

对于内嵌捕获组,反向引用也是一样的操作。

作者:Aptusource.orgAptusource.org
最好的 Java 技术博客
原文地址:[正则] 捕获组, 感谢原作者分享。