为了账号安全,请及时绑定邮箱和手机立即绑定

对 Matcher 类的 asBoolean 方法的误解

对 Matcher 类的 asBoolean 方法的误解

慕桂英3389331 2021-12-01 16:59:25
我有一个小测试脚本的问题: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("--------------------------------");}这是它的输出:cfgLine0: PATTERN1 = 9m: java.util.regex.Matcher[pattern=.*PATTERN2.* region=0,12 lastmatch=]m.asBoolean(): falsem: java.util.regex.Matcher[pattern=.*PATTERN2.* region=0,12 lastmatch=]m.asBoolean(): false--------------------------------cfgLine1: PATTERN2 = 136.225.73.44m: java.util.regex.Matcher[pattern=.*PATTERN2.* region=0,24 lastmatch=]m.asBoolean(): truem: java.util.regex.Matcher[pattern=.*PATTERN2.* region=0,24 lastmatch=PATTERN2 = 136.225.73.44]m.asBoolean(): false--------------------------------cfgLine2: PATTERN3 = 136.225.236.12m: java.util.regex.Matcher[pattern=.*PATTERN2.* region=0,25 lastmatch=]m.asBoolean(): falsem: java.util.regex.Matcher[pattern=.*PATTERN2.* region=0,25 lastmatch=]m.asBoolean(): false如您所见,正则表达式在第二个循环中匹配,但这种行为对我来说很奇怪。我真的不知道为什么如果我asBoolean对同一个 Matcher 对象使用两次,结果是不同的。它有内部迭代器或类似的东西吗?PS:我已经使用==~运算符解决了这个问题,但我想知道为什么 asBoolean 会这样工作。
查看完整描述

1 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

它发生了,因为StringGroovyMethods.asBoolean(Matcher matcher)调用matcher.find()修改了匹配器的内部状态。


/**

 * Coerce a Matcher instance to a boolean value.

 *

 * @param matcher the matcher

 * @return the boolean value

 * @since 1.7.0

 */

public static boolean asBoolean(Matcher matcher) {

    if (null == matcher) {

        return false;

    }


    RegexSupport.setLastMatcher(matcher);

    return matcher.find();

}

来源:src/main/org/codehaus/groovy/runtime/StringGroovyMethods.java


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


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

现在当你m.asBoolean()第二次调用时,匹配器对象被前一次调用修改并表示为:


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

它返回false,因为没有其他部分满足匹配器。


查看完整回答
反对 回复 2021-12-01
  • 1 回答
  • 0 关注
  • 140 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信