Java Matcher类asBoolean方法的误区

Java Matcher类asBoolean方法的误区,java,groovy,Java,Groovy,我有一个小测试脚本的问题: import java.util.regex.Pattern; import java.util.regex.Matcher; cfgText = "PATTERN1 = 9\nPATTERN2 = 136.225.73.44\nPATTERN3 = 136.225.236.12" cfgLine = cfgText.split('\n'); def p = /.*PATTERN2.*/; def PATTERN2_found = false; for (i=0;

我有一个小测试脚本的问题:

import java.util.regex.Pattern;
import java.util.regex.Matcher;

cfgText = "PATTERN1 = 9\nPATTERN2 = 136.225.73.44\nPATTERN3 = 136.225.236.12"

cfgLine = cfgText.split('\n');
def p = /.*PATTERN2.*/;
def PATTERN2_found = false;
for (i=0; PATTERN2_found==false && i < cfgLine.length; i++)
{
    println("cfgLine" +i+ ": " + cfgLine[i]);
    def m = cfgLine[i] =~ p;
    println("m: " + m)
    println("m.asBoolean(): " + m.asBoolean());
    println("m: " + m)
    println("m.asBoolean(): " + m.asBoolean());
    if(m.asBoolean()){
        println("Heeeyyyy");
    }
    println("--------------------------------");
}
正如您可以在第二个循环中看到的那样,正则表达式匹配,但这种行为对我来说很奇怪。我真的不知道为什么对同一个Matcher对象使用两次
asBoolean
,结果会不同。它有内部迭代器或类似的东西吗


PS:我已经用
==~
运算符解决了这个问题,但我想知道为什么asBoolean会这样工作。

之所以会这样,是因为
StringGroovyMethods.asBoolean(Matcher Matcher)
调用
Matcher.find()
,它修改Matcher的内部状态

/**
*将匹配器实例强制为布尔值。
*
*@param matcher匹配器
*@返回布尔值
*@自1.7.0以来
*/
公共静态布尔值asBoolean(匹配器匹配器){
if(null==匹配器){
返回false;
}
RegexSupport.setLastMatcher(matcher);
返回matcher.find();
}
资料来源:

这就是为什么当您第一次调用
m.asBoolean()
时,它返回
true
,因为在此调用之前它的状态是(未找到匹配项):

现在,当您第二次调用
m.asBoolean()
时,matcher对象由上一次调用修改,并由以下表达式表示:

m: java.util.regex.Matcher[pattern=.*PATTERN2.* region=0,24 lastmatch=PATTERN2 = 136.225.73.44]

并且它返回
false
,因为没有其他部分可以满足匹配者的要求。

谢谢!!然而,在我看来,这是一种奇怪的行为,因为使用名称“asBoolean”似乎我只想知道它是否有匹配项。方法的名称并不表示我要修改原始对象。你也有同样的感觉吗?是的,我同意这很混乱,调用
asBoolean()
方法时应该没有副作用。我将其报告为bug(),并正在进行修复,这相当简单。谢谢你抓住这个角落的箱子!
m: java.util.regex.Matcher[pattern=.*PATTERN2.* region=0,24 lastmatch=]
m: java.util.regex.Matcher[pattern=.*PATTERN2.* region=0,24 lastmatch=PATTERN2 = 136.225.73.44]