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

groovy-jdk API doc 给了我...

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() }

前两个例子很简单,但我无法理解其余的例子。

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

第二,为什么会有“它”的列表?
文档说 replaceFirst()



“它”不是指“被捕获组的第一次出现”吗?

我将不胜感激任何提示和评论!

最佳答案

首先,[one:1, two:2] 是一个 Map:

assert [one:1, two:2] instanceof java.util.Map
assert 1 == [one:1, two:2]['one']
assert 2 == [one:1, two:2]['two']
assert 1 == [one:1, two:2].get('one')
assert 2 == [one:1, two:2].get('two')

因此,基本上,闭包内的代码使用该映射作为查找表,将 one 替换为 1 ,将 two 替换为 2

其次,让我们看看 regex matcher works 是如何实现的:



深入研究正则表达式:
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]

所以我们可以更清晰地重写代码,通过 it 重命名 group ( it 就是 default name of the argument in a single argument closure ):
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()
}

关于regex - 如何使用 Groovy 的 replaceFirst 和闭包?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29251482/

10-12 14:05