上一节中我们在学习Quantifier时候,也考察了和Capturing Groups结合的意义。本节主要对Capturing Groups进行描述一下。
它的意义和用途很简单,它就是把一组字符串当做一个整体来看待,比如 (abc)
我们就应该将字符串abc
看做一个整体。
输入匹配的字符串如果匹配Capturing Groups的正则内容,匹配引擎会将匹配部分的位置和信息记录在内存中,以便后续backreference的回调提供上下文环境。
1. 编号
Pattern类java doc中对Capturing Groups根据左括号从左到右进行编号,所以对于((A)(B(C))),则进行如下的标号:
1. ((A)(B(C)))
2. (A)
3. (B(C))
4. (C)
为了了解表达式中多个Group,可以通过Matcher.groupCount
方法获取.
这里存在一个特殊的group, group0, 它代表整个正则表达式,它是不会包含在groupCount返回值里面的。
对于group的编号我们得认真理解,在Matcher里面有关很多方法涉及到group number的概念.
public int start(int group)
: Returns the start index of the subsequence captured by the given group during the previous match operation.
public int end (int group)
: Returns the index of the last character, plus one, of the subsequence captured by the given group during the previous match operation.
public String group (int group)
: Returns the input subsequence captured by the given group during the previous match operation.
2. backreferences
我们在上面提交到如果capturing groups匹配到,它会将group匹配的结果放到内存里面,可以给backreference进行索引,
下面先通过一个例子进行了解一下:
上面就只有一个group, group开始匹配的结果是12
,这是因为(\d\d)
表示两个数字,此时,内存里面会记录group 1的匹配值为12, 接着匹配\1
时,这个表示group 1匹配的值,此时,就应该要求接下来的字符串也是12
,故当前匹配的字符串是1212
.
下面我们稍微调整一下看看结果:
上面的结果也就很明白了。