Сопоставитель Groovy Regex ИЛИ — либо уникальные группы, либо повторяющиеся идентификаторы групп

Я хочу регулярно искать строку, представляющую файл журнала, находить несколько потенциальных сообщений об ошибках и распечатывать результат.

Пример ввода (одна строка)

 ...
 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, которые МОГУТ присутствовать, не вызывая исключений? В качестве альтернативы, я иду по этому пути неправильно, и есть ли более простой способ достичь своей цели?


person pghprogrammer4    schedule 30.04.2019    source источник
comment
Можете ли вы привести несколько примеров вашего вклада и желаемого результата?   -  person CAustin    schedule 30.04.2019
comment
Обновлено для включения примеров!   -  person pghprogrammer4    schedule 30.04.2019
comment
то, что вы делаете до сих пор, - это план java, а не groovy. Отличным способом было бы использовать someString.eachMatch( /some regex/ ){ doStuffWithMatches() }   -  person injecteer    schedule 01.05.2019
comment
Я определенно могу изменить его, чтобы он был более похожим на groovy, и я ценю изучение лучшего способа поиска по регулярным выражениям! Но суть моего вопроса заключается в вашей doStuffWithMatches() инкапсуляции, в частности, как я могу проверить наличие имен групп регулярных выражений, не вызывая исключений.   -  person pghprogrammer4    schedule 01.05.2019


Ответы (1)


Я искал то же самое и не смог найти «более крутой» способ сделать это.

Единственное решение, которое я нашел, состояло в том, чтобы проверить, содержит ли строка шаблона имя группы:

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