Groovy 中的多行正则表达式不匹配

问题描述 投票:0回答:2

我正在努力在 Groovy 中构建多行匹配正则表达式。

给出以下日志:

12:42:44,914 ma# ERROR [a.o.k.b.p.A] ********************* Es folgen aggregierte Fehler *********************

12:42:44,915 ma# ERROR [a.o.k.b.p.A] at.java.lang.NullPointerException
    at a.o.k.b.s.AbstractSvc.buildFinalException(AbstractSvc.java:236)
(in 2 Items, z.B. 1114/00347, 1114/00537)

12:42:44,916 ma# ERROR [a.o.k.b.p.A] HTTP 400
(in 2 Items, z.B. 1128/01634, 1128/02616)

12:42:44,916 ma# ERROR [a.o.k.b.p.A] >>>>> 50 Polizzen polizziert, davon 4 Polizzen fehlerhaft mit 2 verschiedenen Fehler!

理想情况下我希望提取第一行和最后一行之间的所有行。

我正在尝试通过访问 Jenkins 日志

    def logMatcher = manager.getLogMatcher('(?s).*aggregierte(.*)Polizzen polizziert.*')
    if (logMatcher?.matches()) {
        def result = logMatcher.group(1)
        manager.addWarningBadge(result)
    }

我希望它会给我一个粗略的匹配(包括第一行和最后一行的部分),但它不会在 if 块中运行。

我在这里做错了什么?我在 regex101.com 上的测试表明这应该有效。在 Jenkins 上,只有在一行内才会匹配,例如正则表达式 ".Es (.) aggregierte Fehler.*"

regex jenkins logging groovy multiline
2个回答
1
投票

问题是 Jenkin 的 goovy-postbuild-plugin 限制为单行,正如 daggett 对我的问题评论的那样。


0
投票

由于 groovy-postbuild-plugin 不支持

manager.getLogMatcher()
中的多行正则表达式,这里有一个使用原生 API 的解决方案:

import java.util.regex.Pattern 
import java.util.regex.Matcher
def regex = '(?s).*aggregierte(.*)Polizzen polizziert.*'
def pattern = Pattern.compile(regex, Pattern.MULTILINE)
def matcher = pattern.matcher(manager.build.logFile.text);
matcher.find()

// you can now use matcher.group(1) to access the contents of group 1
© www.soinside.com 2019 - 2024. All rights reserved.