java正则表达式之 group

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'), 

猜你喜欢

转载自blog.csdn.net/saywhat_sayhello/article/details/81120044