如何在不改变Matcher状态的情况下使用find()?

时间:2017-06-09 16:10:26

标签: java regex matcher

我有以下代码:

class someclass {
    Pattern pattern1 = Pattern.compile("\\G regex1");
    Pattern pattern2 = Pattern.compile("\\G regex2");
    Matcher matcher; 

    public void parse(str) { 
        matcher = pattern1.matcher(str);
        if(matcher.find() {
            method1();
        }
        else if(matcher.usePattern(pattern2).find())
            method2();
    }
}

是否可以在不消耗捕获组的情况下测试匹配?我试图匹配前瞻模式"\G(?=pattern)",但它不起作用。我需要父方法parse()和被调用方法method1()method2()中捕获的字符串;但被调用的方法在匹配器的输入处查找它。

1 个答案:

答案 0 :(得分:1)

您不能告诉匹配器不要使用捕获组,但是您可以重置它以丢弃其内部状态并从字符串的开头重新开始:

Pattern p = Pattern.compile("(\\d)"); // single digit
String myString = "12345";
Matcher matcher = p.matcher(myString);

if(matcher.find()) { // expecting 1
    System.out.println(matcher.group(1));
}
if(matcher.find()) { // expecting 2
    System.out.println(matcher.group(1));
}
if(matcher.find()) { // expecting 3
    System.out.println(matcher.group(1));
}
matcher.reset(); // discard internal state, next find() will return 1 again


if(matcher.find()) { // expecting 1
    System.out.println(matcher.group(1));
}

输出:

1
2
3
1

DEMO