在 jenkins 管道中使用正则表达式时测试是否匹配

Test if there is a match when using regular expression in jenkins pipeline

我正在使用正则表达式从管道中的字符串中获取数字 只要我有匹配就可以正常工作,但是当没有匹配时我会收到错误消息

java.lang.IndexOutOfBoundsException: index is out of range 0..-1 (index = 0)

当我尝试在下一行捕获组时出现错误

 env.ChangeNr = chngnr[0][1] 

如果我的捕获组中没有匹配项,我该如何测试?

这是管道

pipeline {
    agent {
        node {
            label 'myApplicationNode'
        }
    }
    environment {
        GIT_MESSAGE = "${bat(script: "git log --no-walk --format=format:%%s ${GIT_COMMIT}", returnStdout: true)}".readLines().drop(2).join(" ")
    }
    stages {
        stage('get_commit_msg'){              
            steps {
                script {
                     def gitmsg=env.GIT_MESSAGE
                     def chngnr = gitmsg =~/([0-9]{1,8})/
                     env.ChangeNr = chngnr[0][1] /* put test if nothing is extracted */                 
                }
            }
        }
    }
}

在 groovy 中,当您使用 =~(查找运算符)时,它实际上会创建一个 java.util.regex.Matcher,因此您可以使用任何 its standard methods,例如 find()size(),因此在您的情况下,您可以在尝试提取任何组之前开玩笑地使用 size 函数来测试是否存在任何匹配的模式:

def chngnr = gitmsg =~/([0-9]{1,8})/
assert chngnr.size() > 0 
env.ChangeNr = chngnr[0][1]

另一个不错的选择是在布尔上下文中使用 =~ 运算符,在这种情况下,Groovy 隐式调用 matcher.find() 方法,这意味着表达式计算到 true 如果字符串的任何部分匹配模式:

def chngnr = gitmsg =~/([0-9]{1,8})/
if(chngnr){
    env.ChangeNr = chngnr[0][1]
}
else {
   ...
}

您可以阅读有关 Groovy 正则表达式 Here

的更多信息