Groovy正则表达式匹配器,或者-唯一组或重复组ID

时间:2019-04-30 17:36:36

标签: regex groovy regex-group logical-or

我想正则表达式搜索代表日志文件的字符串,找到多个潜在的错误消息,然后打印结果。

示例输入(单字符串)

 ...
 Unable to parse YAML file: [mapping values are not allowed in this context] at line 1234\r\n
 worthless line\r\n
 KitchenInventory.cs(285,118): error CS2345: 'ButteryBread' does not contain a definition for 'DropOnFloor'\r\n
 another worthless line\r\n
 ...

每种错误类型都有我要捕获的某些分组类别,这些类别可能会或可能不会出现在其他错误类型中。

我的目标是在执行正则表达式搜索后输出错误详细信息,并填写每个错误正则表达式中存在的尽可能多的值:

  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错误的文件名。

我发现我无法进行逻辑或以创建庞大的Regex字符串,因为存在重复的分组名称。我尝试分别进行每个正则表达式搜索,但是在检查字段是否存在时收到异常消息:

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正则表达式组名,而不会引发异常?或者,我会以错误的方式走下去,是否有更简单的方法可以实现目标?

1 个答案:

答案 0 :(得分:0)

我一直在寻找相同的东西,却找不到一种“更时髦”的方式。

我发现的唯一解决方案是验证模式字符串是否包含组名:

if (stringPattern.contains('message')) {
   println "Message: "+matcher.group('message')
}