我目前正在学习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>
答案 0 :(得分:1)
问题是在访问组之前,Matcher
没有“运行”,执行。您只能使用本地Groovy代码访问匹配项,但是要访问组,必须使用Matcher
“运行”方法,例如matches()
或{{ 1}}。
请注意,您的情况下的find()
对assert
进行了布尔转换,最终转换为Matcher
(如noted by blackdrag)。
matches()
不会自动运行是有道理的,因为它不知道用户打算使用哪种确切方法-Matcher
或matches()
(如{{3 }}。