【问题标题】:Groovy: Idiomatic way to replace captured groupsGroovy:替换捕获组的惯用方法
【发布时间】:2018-01-10 10:41:40
【问题描述】:

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

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

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,但我想知道是否有更惯用的方法来做到这一点。请注意,我不想删除捕获的组,只需将它们替换为星号,从而非常清楚该命令没有错误,但出于安全目的进行了混淆。

【问题讨论】:

    标签: java regex groovy regex-group


    【解决方案1】:

    我自己通过积极的后视发现了以下解决方案:

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

    【讨论】:

    • 如果-u 和 1+ 个非空白字符之间有 2 个或更多空格,您的后向方法将失败。捕获组方法是正确的方法。您可能会使用/(?&lt;=-[up]\s{1,100})(\S+)/,但它是 Java 正则表达式中的一个 hacky 功能。
    • @WiktorStribiżew 也许你指的是java中的look-behind必须是已知长度的事实,所以 \s+ 不起作用。我改用 \s{1,10} 。我更喜欢这个而不是 daggett 的答案的原因是,IMO,它更清楚地表达了要求。
    【解决方案2】:
    def cmd='docker login -u username -p password docker-registry-url'
    println cmd.replaceAll(/(\s-[up]\s+)(\S+)/,'$1***')
    

    输出:

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

    【讨论】:

    • 我自己找到了一个解决方案,使用积极的后视。我会接受你的回答,因为你引导我。
    猜你喜欢
    • 1970-01-01
    • 2011-02-24
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    相关资源
    最近更新 更多