理解Matcher类中的group(),group(int i),groupcount() 这三个方法的区别,需要理解捕获组的意思。捕获组也就是Pattern中用()分割的子模式。列如例题代码中的regex[2] , (o*)z(o*)j(o*) :
group0 :是指这个pattern串 (o*)z(o*)j(o*) ;
group1: 是指第一个子模式(o*);
group2: 是指第二个子模式(o*);
group3: 是指第三个子模式(o*);
而m.group(0) 等效于 m.group() 是指输入序列str匹配整个模式,m.group(1)是指从左往右数的第一个子模式,是指str仅与第一个子模式匹配。以此类推。而 groupcount() 这是表示当前模式中子模式的个数。
例题:http://acm.hdu.edu.cn/showproblem.php?pid=3788
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main{
/**
* 1. zoj能AC;
* 2. 若字符串形式为xzojx,则也能AC,其中x可以是N个'o' 或者为空;
* 3. 若azbjc 能AC,则azbojac也能AC,其中a,b,c为N个'o'或者为空 也就是 c / a = b ;
* @param args
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String regex[] = new String[]{"zoj","(o*)zoj(o*)","(o*)z(o*)j(o*)"};
while(sc.hasNext()){
String str = sc.nextLine();
if(str.equals("zj")) { // 开始没判断 zj wa 了两次
System.out.println("Wrong Answer");
continue;
}
boolean bool = false;
for(int i = 0; i < regex.length ; i++)
{
if(i == 0 && str.matches(regex[i])){
bool = true;
break;
}else if(i == 1){
Pattern p = Pattern.compile(regex[i]);
Matcher m = p.matcher(str);
if(str.matches(regex[i] ) && m.find() && m.group(1).equals(m.group(2))){
bool = true;
break;
}
}else{
Pattern p = Pattern.compile(regex[i]);
Matcher m = p.matcher(str);
while(m.find() && str.matches(regex[i])){
int s1 = m.group(1).length();
int s2 = m.group(2).length();
int s3 = m.group(3).length();
if(s3 % s2 == 0 && ( s3 / s2 == s1)){
bool = true;
break;
}
}
}
}
if(bool){
System.out.println("Accepted");
}else{
System.out.println("Wrong Answer");
}
}
}
}