【Java正则表达式系列】7 Capturing Groups(匹配组)

上一节中我们在学习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进行索引,
下面先通过一个例子进行了解一下:
【Java正则表达式系列】7 Capturing Groups(匹配组)_第1张图片

上面就只有一个group, group开始匹配的结果是12,这是因为(\d\d)表示两个数字,此时,内存里面会记录group 1的匹配值为12, 接着匹配\1时,这个表示group 1匹配的值,此时,就应该要求接下来的字符串也是12,故当前匹配的字符串是1212.

下面我们稍微调整一下看看结果:
【Java正则表达式系列】7 Capturing Groups(匹配组)_第2张图片

上面的结果也就很明白了。

上一节 【Java正则表达式系列】6. Quantifiers(量词)

下一节: Java正则表达式系列】8 Boundary Matcher(边界匹配)

你可能感兴趣的:(Java,Core,Java)