无法使用正则表达式从字符串中获得多个匹配项

时间:2017-08-17 18:28:54

标签: java jenkins groovy jenkins-pipeline

我一直在寻找解决这个问题的各种解决方案,我尝试了多个像[1]这样的建议并且没有成功。任务相对简单,我成功地抓住了一场比赛,所以我知道我的正则表达式是正确的。我正在使用我的Jenkins管道脚本中的Groovy

这是问题,我有一个我读过的文件,如下所示

<log><logentry revision="4813"><msg>nvcs-0909 haha nvpl-6700</msg></logentry></log>

我想要做的就是抓住 nvcs-0909 nvpl-6700 并将它们作为currentBuild.description放置。我可以做一个,但不能获得多个条目

这是我到目前为止所拥有的

textOfFile = readFile("..\\builds\\$BUILD_NUMBER\\changelog0.xml")
regex = /[Nn][Vv]..[-\s]{1,3}\d+/
allIssues = (textOfFile =~ regex)

当我打印所有问题时,我得到了

java.util.regex.Matcher[pattern=[Nn][Vv]..[-\s]{1,3}\d+ region=0,377 lastmatch=]

我怎样才能让它发挥作用?

我也试过

allIssues = textOfFile.findAll(regex)

那也失败了,但是

allIssues = textOfFile.find(regex)

有效,我得到了我预期的第一场比赛

2 个答案:

答案 0 :(得分:0)

工作正常:

def textOfFile = '''<log><logentry revision="4813"><msg>nvcs-0909 haha nvpl-6700</msg></logentry></log>'''
def regex = /[Nn][Vv]..[-\s]{1,3}\d+/

println (textOfFile =~ regex).findAll()

结果:

[nvcs-0909, nvpl-6700]

答案 1 :(得分:0)

所以这个问题是我之前遇到过的问题,但却被隐藏了,因为这次我添加了一个try / catch而不是更早的find方法。目前的代码是

def textOfFile
try {
    textOfFile = readFile("..\\builds\\$BUILD_NUMBER\\changelog0.xml")
    List<String> allIssues = textOfFile.findAll("[Nn][Vv]..[-\\s]{1,3}\\d+")
    issueDescription = ""

    for(int i = 0; i < allIssues.size(); i++)
        issueDescription += allIssues[i].toUpperCase() + (i < allIssues.size() - 1 ? ", ":"")

    currentBuild.description = issueDescription
}
catch(e) {
    echo "ERROR"
}

由于我试图围绕世界上发生的事情,我用

打印了错误信息
println e.getMessage()

在catch块内,它给出了以下消息

Scripts not permitted to use staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods findAll java.lang.String

之前我遇到过此消息并在this的帮助下解决了这个问题。但Jenkins不会给我添加权限的选项,你也不能自己手动添加它们(管理Jenkins - &gt;进程内脚本批准)。

所以我注释了try / catch,运行脚本,让Jenkins捕获异常,并且我可以选择允许我的脚本使用findAll方法。然后我再次运行它并且它完美地工作并重新包装了try / catch中的代码。

我猜测当你的脚本抛出异常并且从不捕获它时,会触发允许你在Jenkins中允许方法权限的通知机制。无论如何它现在工作得很好。