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