java正規表示式之 group

sayWhat_sayHello發表於2018-07-19

api裡沒有例子,這裡我給個例子。結合api講一講。
group其實按括號來劃分(從左到右一層層劃分):
((A)(B(C)))·呼叫Matcher的例項方法groupCount()可以得到4。

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

另外0 指的是本身。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PatternRegex {
    public static void main(String[] args) {
        String regex = "((A)(B(C)))";
        String line = "ABCCBAAAABC";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(line);
        System.out.println(m.groupCount());
        while (m.find()) {
            for (int i = 0; i <= m.groupCount(); i++) {
                System.out.println(i +" "+ m.group(i)+" " + m.start(i) + " " + m.end(i));
            }
        }
        boolean b = m.find();

    }
}

執行結果:

4
ABC
0 ABC 0 3
1 ABC 0 3
2 A 0 1
3 BC 1 3
4 C 2 3
ABC
0 ABC 8 11
1 ABC 8 11
2 A 8 9
3 BC 9 11
4 C 10 11

結果解析:
可以看到((A)(B(C)))成功匹配了兩次。0和1的結果是一樣的,第一個ABC的下標為0-3,第二個下標為8-11。2對應了(A),ABC裡的A第一個為0-1,第二個為8-9.同理3,4.

另外:
((A)):

0:((A))
1:((A))
2:(A)

((A)A):

0:((A)A)
1:((A)A)
2:(A)

((A)(A)):

0:((A)(A))
1:((A)(A))
2:(A)
3:(A)

((A)(A))A

0:((A)(A))A
1:((A)(A))
2:(A)
3:(A)

Group除了可以用數字標識還可以用name,方式如下:
?<name>X
而name的命名規範為:

The first character must be a letter.
    The uppercase letters 'A' through 'Z' ('\u0041' through '\u005a'),
    The lowercase letters 'a' through 'z' ('\u0061' through '\u007a'),
    The digits '0' through '9' ('\u0030' through '\u0039'), 

相關文章