Jenkins管道正则表达式模式不匹配

3

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

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吗? - Wiktor Stribiżew
好吧,说实话,我最初使用捕获组仅抓取第一部分,但只是简化它以查看是否匹配任何内容。在这种情况下,是的,只匹配'''v1.9.1'''。 - ION
然后添加 if(major) { println major.group() } - Wiktor Stribiżew
lastmatch 不应该返回一些东西吗?我期望它包含一些内容,在 Jenkins 中使用正则表达式还很新。 - ION
不,(current_tag =~ /v.+\.\d+\.\d*/)是一个尚未运行的匹配器。 - Wiktor Stribiżew
1个回答

3
major.matches()

lastmatch属性留空是因为在代码行def major = (current_tag =~ /v.+\.\d+\.\d*/)中,你仅仅初始化了Matcher对象但没有进行"运行"。

如果要获取一个匹配,你需要先运行它,可以使用如下代码:

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

如果你的正则表达式模式中有一个捕获组,请在group()内使用相应的ID。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接