Groovy:替换捕获组的惯用方式

Groovy: Idiomatic way to replace captured groups

我有这样的字符串:docker login -u username -p password docker-registry-url.

我使用 execute 在 Groovy 脚本中执行命令。出于调试目的,我在执行前打印命令,但由于它包含敏感数据,我混淆了用户名和密码。

def printableCmd = cmd.toString()

def m = printableCmd =~ /(?:.+) -u (.+) -p (.+) (?:.+)/

if (m.matches() && m[0].size() >= 3) {
  printableCmd = m[0][-1..-2].inject(m[0][0]) { acc, val -> acc.replaceAll(val, "***") }
}

以上按预期工作并打印 docker login -u *** -p *** docker-registry-url,但我想知道是否有更惯用的方法来执行此操作。请注意,我不想删除捕获的组,只是将它们替换为星号,从而非常清楚该命令没有错误,但出于安全目的进行了混淆。

def cmd='docker login -u username -p password docker-registry-url'
println cmd.replaceAll(/(\s-[up]\s+)(\S+)/,'***')

输出:

docker login -u *** -p *** docker-registry-url

我自己使用正面回顾找到了以下解决方案:

​def cmd = "docker login -u username -p password docker-registry-url"
println cmd.replaceAll(/(?<=-[up]\s)(\S+)/,"***")