猿问

对 Matcher 类的 asBoolean 方法的误解

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


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 = 9

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

m.asBoolean(): false

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

m.asBoolean(): false

--------------------------------

cfgLine1: PATTERN2 = 136.225.73.44

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

m.asBoolean(): true

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

m.asBoolean(): false

--------------------------------

cfgLine2: PATTERN3 = 136.225.236.12

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

m.asBoolean(): false

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

m.asBoolean(): false


如您所见,正则表达式在第二个循环中匹配,但这种行为对我来说很奇怪。我真的不知道为什么如果我asBoolean对同一个 Matcher 对象使用两次,结果是不同的。它有内部迭代器或类似的东西吗?


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


慕桂英3389331
浏览 141回答 1
1回答

九州编程

它发生了,因为StringGroovyMethods.asBoolean(Matcher matcher)调用matcher.find()修改了匹配器的内部状态。/**&nbsp;* Coerce a Matcher instance to a boolean value.&nbsp;*&nbsp;* @param matcher the matcher&nbsp;* @return the boolean value&nbsp;* @since 1.7.0&nbsp;*/public static boolean asBoolean(Matcher matcher) {&nbsp; &nbsp; if (null == matcher) {&nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; }&nbsp; &nbsp; RegexSupport.setLastMatcher(matcher);&nbsp; &nbsp; 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,因为没有其他部分满足匹配器。
随时随地看视频慕课网APP

相关分类

Java
我要回答