2013-11-17 23:57 415人阅读 (0) 收藏
分类:
java正则
版权声明:本文为博主原创文章,未经博主允许不得转载。
理解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() 这是表示当前模式中子模式的个数。
例题:
[java]
- 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");
- }
- }
- }
- }