我想正则表达式搜索表示日志文件的字符串,找到多个潜在的错误消息,然后打印结果。
示例输入(单个字符串)
...
Unable to parse YAML file: [mapping values are not allowed in this context] at line 1234rn
worthless linern
KitchenInventory.cs(285,118): error CS2345: 'ButteryBread' does not contain a definition for 'DropOnFloor'rn
another worthless linern
...
每种错误类型都有我尝试捕获的某些分组类别,这些类别在其他错误类型中可能存在,也可能不存在。
我的目标是在执行正则表达式搜索后输出错误详细信息,填写每个错误正则表达式中存在的尽可能多的值:
Error: Unable to parse YAML file
Details: mapping values are not allowed in this context
Line: 1234
Error: CS2345
Details: 'ButteryBread' does not contain a definition for 'DropOnFloor'
Filename: KitchenInventory.cs
Line: 285,118
(请注意,由于 YAML 错误不包含该信息,因此 YAML 错误省略了文件名。
我发现我无法执行逻辑 OR 来创建大量的正则表达式字符串,因为存在重复的分组名称。我尝试单独执行每个正则表达式搜索,但在检查字段是否存在时收到异常:
def pattern = ~patternString
def matcher = pattern.matcher(lines)
while (matcher.find()) {
if (matcher.group('filename')) {
println "Filename: "+matcher.group('filename')
}
if (matcher.group('error')) {
println "Error: "+matcher.group('error')
}
if (matcher.group('message')) {
println "Message: "+matcher.group('message')
}
}
Caught: java.lang.IllegalArgumentException: No group with name <errorCode>
java.lang.IllegalArgumentException: No group with name <errorCode>
有没有办法让我循环访问可能存在的 Groovy 正则表达式组名称,而不会引发异常?或者,我是否以错误的方式做到这一点,是否有更简单的方法来实现我的目标?
我一直在寻找同样的东西,但无法找到一种"更时髦"的方式来做到这一点。
我找到的唯一解决方案是验证模式字符串是否包含组名称:
if (stringPattern.contains('message')) {
println "Message: "+matcher.group('message')
}