Возвратите повторные группы, только если они превышают определенное число - PullRequest
0 голосов
/ 31 января 2020

Я настраиваю регулярное выражение для поиска исключений нулевого указателя в журналах. Регулярное выражение для этого очень просто:

(java\.lang\.NullPointerException)

И это возвращает три группы из моих журналов:

2020-01-31 00:00:01 - Searching for account details
Error:
java.lang.NullPointerException
2020-01-31 00:00:30 - Searching for account details
Error:
java.lang.NullPointerException
2020-01-31 00:00:50 - Searching for account details
Error:
java.lang.NullPointerException

Что я хотел бы сделать, это настроить, чтобы возвращать результаты только в том случае, если существует более определенного числа подходящих групп. Например, (java .lang.NullPointerException) {2,} теоретически должно возвращать результаты для двух или более групп, тогда как {4,} не должно совпадать. До сих пор я читал об использовании фигурных скобок для этого, но я не смог заставить это работать с чем-либо, кроме {1,} - все остальное просто не возвращает совпадений.

РЕДАКТИРОВАТЬ: Спасибо Павлу за ответ. Я сделал небольшую модификацию для моего варианта использования:

(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\s-\sSearching\sfor\saccount\sdetails\nError:\njava\.lang\.NullPointerException[\s\S]){10,}

Этот шаблон должен точно соответствовать этому сообщению от даты до ошибки нулевого указателя. Я также удалил * из [\s\S], чтобы он улавливал только 10 последовательных ошибок. Таким образом, если есть 10 или более экземпляров:

2020-01-31 00:00:01 - Searching for account details
Error:
java.lang.NullPointerException

, он вернет совпадение. Но если есть что-то вроде:

2020-01-31 00:00:50 - Searching for account details
Error:
java.lang.NullPointerException
2020-01-31 00:00:50 - Searching for account details
Found something:
Hello world
2020-01-31 00:00:50 - Searching for account details
Error:
java.lang.NullPointerException

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

1 Ответ

1 голос
/ 31 января 2020

Это работает так, как вы это описываете:

(java\.lang\.NullPointerException[\s\S]*){2,}

Видите, вам нужно добавить [\ s \ S] * в конец, чтобы он совпадал со всеми символами между двумя исключениями, включая пробелы.

Вот демоверсия: https://regex101.com/r/dnIgKs/1/

...