为什么不能在Groovy中内联调用正则表达式匹配器的方法

时间:2019-02-03 22:33:41

标签: regex groovy

我目前正在学习groovy,更多是出于乐趣而不是必要,但我遇到了一些我不太了解的东西。

如果我运行以下命令:

["SEMOLINA_0001"].collect {
    def m = it =~ /SEMOLINA_([A-Fa-f0-9]+)/
    println m
    assert m
    println m
    return m.group(1)
}

我得到结果:

java.util.regex.Matcher[pattern=SEMOLINA_([A-Fa-f0-9]+) region=0,13 lastmatch=]
java.util.regex.Matcher[pattern=SEMOLINA_([A-Fa-f0-9]+) region=0,13 lastmatch=SEMOLINA_0001]
Result: [0001]

如果删除assert,则在.group(1)调用中会收到“找不到匹配项”异常。

我显然可以解决此问题,但是我不喜欢我不理解的语言行为-我不会想到assert会产生副作用,所以这是一个错误还是这我还没有掌握的故意行为?

(对于可能的价值,我在上面的示例中使用的是Groovy 2.5.5。)

我也刚刚注意到this question被关闭了,但我认为是错误的,因为用户的问题似乎更像是这个问题,而不是与命名组本身有关。 / p>

1 个答案:

答案 0 :(得分:1)

问题是在访问组之前,Matcher没有“运行”,执行。您只能使用本地Groovy代码访问匹​​配项,但是要访问,必须使用Matcher“运行”方法,例如matches()或{{ 1}}。

请注意,您的情况下的find()assert进行了布尔转换,最终转换为Matcher(如noted by blackdrag)。

matches()不会自动运行是有道理的,因为它不知道用户打算使用哪种确切方法-Matchermatches()(如{{3 }}。