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 个字符串文字:
- 普通双引号:
"Hello $world, my name is ${name.toUpperCase()}"
Slashy
-通常用作正则表达式的字符串:/.{$depth}/
- 多行双引号字符串:
def email = """
Dear ${user}.
Thank your for blablah.
"""
在以下声明性语法管道中:
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 个字符串文字:
- 普通双引号:
"Hello $world, my name is ${name.toUpperCase()}"
Slashy
-通常用作正则表达式的字符串:/.{$depth}/
- 多行双引号字符串:
def email = """
Dear ${user}.
Thank your for blablah.
"""