Regex 如何使用Groovy';谁先结束?

Regex 如何使用Groovy';谁先结束?,regex,groovy,closures,Regex,Groovy,Closures,我是Groovy的新手,有一个关于带闭包的replaceFirst的问题 这本书给了我一些 assert "hellO world" == "hello world".replaceFirst("(o)") { it[0].toUpperCase() } // first match assert "hellO wOrld" == "hello world".replaceAll("(o)") { it[0].toUpperCase() } // all matches assert '1

我是Groovy的新手,有一个关于带闭包的
replaceFirst
的问题

这本书给了我一些

assert "hellO world" == "hello world".replaceFirst("(o)") { it[0].toUpperCase() } // first match
assert "hellO wOrld" == "hello world".replaceAll("(o)") { it[0].toUpperCase() }   // all matches

assert '1-FISH, two fish' == "one fish, two fish".replaceFirst(/([a-z]{3})\s([a-z]{4})/) { [one:1, two:2][it[1]] + '-' + it[2].toUpperCase() }
assert '1-FISH, 2-FISH' == "one fish, two fish".replaceAll(/([a-z]{3})\s([a-z]{4})/) { [one:1, two:2][it[1]] + '-' + it[2].toUpperCase() }
前两个例子很简单,但我不能理解其余的

首先,
[1:1,2:2]
是什么意思? 我甚至不知道要搜索的名称

第二,为什么会有一个“it”列表? 医生说replaceFirst()

用对该文本的闭包调用的结果替换捕获组的第一个匹配项

“它”不是指“第一次出现一个被捕获的群体”吗


我将感谢任何提示和意见

首先,
[one:1,two:2]
是一张地图:

assert[one:1,two:2]instanceof java.util.Map
断言1==[1:1,2:2]['1']
断言2==[1:1,2:2]['two']
断言1==[1:1,2:2]。获取('1')
断言2==[1:1,2:2]。获取('2')
因此,基本上,闭包中的代码使用该映射作为查找表,用
1
替换
1
,用
2
替换
2

第二,让我们看看:

要了解表达式中存在多少组,请调用 匹配器对象上的groupCount方法。groupCount方法返回 一个整数,显示匹配器中存在的捕获组数 图案在本例中,groupCount将返回数字4, 显示模式包含4个捕获组

还有一个特殊的组,组0,它始终表示整个表达式。该组不包括在报告的总数中 groupCount.以(?)开头的组是纯的非捕获组 不捕获文本且不计入组总数的

深入到正则表达式的内容:

def m = 'one fish, two fish' =~ /([a-z]{3})\s([a-z]{4})/
assert m instanceof java.util.regex.Matcher
m.each { group ->
    println group
}
这将产生:

[one fish, one, fish] // only this first match for "replaceFirst"
[two fish, two, fish]
因此,我们可以通过
group
重命名
it
it
)以更清晰的方式重写代码:

assert '1-FISH, two fish' == "one fish, two fish".replaceFirst(/([a-z]{3})\s([a-z]{4})/) { group ->
    [one:1, two:2][group[1]] + '-' + group[2].toUpperCase() 
}
assert '1-FISH, 2-FISH' == "one fish, two fish".replaceAll(/([a-z]{3})\s([a-z]{4})/) { group ->
    [one:1, two:2][group[1]] + '-' + group[2].toUpperCase()
}