Jenkinsfile/Groovy:如何在正则表达式模式查找计数中使用变量?

Jenkinsfile/Groovy: how to use variables in regex pattern find-counts?

在以下声明性语法管道中:

pipeline {
  agent any
  stages {
    stage( "1" ) {
      steps {
        script {
          orig = "/path/to/file"
          two_lev_down = (orig =~ /^(?:\/[^\/]*){2}(.*)/)[0][1]
          echo "${two_lev_down}"
          depth = 2
          two_lev_down = (orig =~ /^(?:\/[^\/]*){depth}(.*)/)[0][1]
          echo "${two_lev_down}"
        }
      }
    }
  }
}

...正则表达式旨在匹配“/”的第三个实例之后的所有内容。
第一个,即 (orig =~ /^(?:\/[^\/]*){2}(.*)/)[0][1] 有效。
但是第二个 (orig =~ /^(?:\/[^\/]*){depth}(.*)/)[0][1] 没有。它生成此错误:

java.util.regex.PatternSyntaxException: Illegal repetition near index 10
^(?:/[^/]*){depth}(.*)

我假设问题是使用变量 depth 而不是硬编码整数,因为这是工作代码和错误生成代码之间的唯一区别。

如何在正则表达式模式查找计数中使用 Groovy 变量? 或者 Groovy 语言的惯用方式是什么来编写returns 第 n 次出现模式后的所有内容的正则表达式?

您缺少变量前面的 $。应该是:

orig = "/path/to/file"
depth = 2           
two_lev_down = (orig =~ /^(?:\/[^\/]*){$depth}(.*)/)[0][1]

assert '/file' == two_lev_down 

为什么

在 Groovy 中,字符串插值(超过 GString)适用于 3 个字符串文字:

  1. 普通双引号:"Hello $world, my name is ${name.toUpperCase()}"
  2. Slashy-通常用作正则表达式的字符串:/.{$depth}/
  3. 多行双引号字符串:
def email = """
Dear ${user}.
Thank your for blablah.
"""