【问题标题】:Jenkins pipeline Regex pattern not matchingJenkins管道正则表达式模式不匹配
【发布时间】:2019-09-16 13:59:42
【问题描述】:

目前有一个不寻常的问题,我正在遍历标签列表并针对正则表达式模式进行测试以查看它是否匹配。

def tags = sh ( script: "git ls-remote --tags git@bitbucket.org:<PATH_TO_GIT_REPO>.git ", returnStdout: true)
def tag_line = tags.split("\n")
tag_line.each
{
    tag ->
    // println(tag)
    current_tag = tag.split()[1].split("/")[2].trim()
    println("Current Line: " + current_tag)

    def major = (current_tag =~ /v.+\.\d+\.\d*/)
    println(major)

}

如果我使用正则表达式在线测试器,则会返回匹配项。但是无论我做什么,控制台的输出如下:

Current Line: v1.9.0^{}
[Pipeline] echo
java.util.regex.Matcher[pattern=v.+\.\d+\.\d* region=0,9 lastmatch=]
[Pipeline] echo
Current Line: v1.9.1
[Pipeline] echo
java.util.regex.Matcher[pattern=v.+\.\d+\.\d* region=0,6 lastmatch=]

【问题讨论】:

  • 你到底需要得到什么? v1.9.1?
  • 好吧,老实说,我最初是使用捕获组来抓取第一部分,但只是简化了它以查看它是否匹配任何内容。在这种情况下,是的,只需匹配 '''v1.9.1'''。
  • 然后添加if (major) { println major.group() }
  • 不应该 lastmatch 返回一些东西吗?期望它包含一些东西,对于在 Jenkins 中使用正则表达式来说非常新。
  • 不,(current_tag =~ /v.+\.\d+\.\d*/) 是一个尚未运行的匹配器。

标签: regex git jenkins


【解决方案1】:

lastmatch 属性为空,因为使用def major = (current_tag =~ /v.+\.\d+\.\d*/) 行代码您只初始化了 Matcher 对象,但没有“运行”它。

要获得匹配,你需要先运行它,你可以这样做,比如说,使用

if (major) {
  println major.group()
}

如果您的正则表达式模式中有一个捕获组,请在 group() 中使用适当的 ID。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多