Вы можете проверить с начала шаблона, что следующая строка не начинается с, например, [
и di git, используя отрицательный прогноз (?!.*\R\[\d)
, так как впоследствии вы используете встроенные модификаторы (?sx)
.
Эта часть (F:[^ ]+|F:)
может быть закорочена для соответствия F: и 0+ раз непробельный символ (F:\S*)
В классе символов [\d -:]
дефис соответствует диапазону вместо только символ дефиса Если вы хотели буквально сопоставить его, вы можете, например, переместить его в конец и добавить соответствующую ему точку.
^(?!.*\R\[\d)\[([\d :.-]+)]ERROR.*?(F:\S*)(?sx).*?\b([a-zA-Z]*Exception)\b
Пояснение
^
Начало строки (?!.*\R\[\d)
Отрицательный прогноз, утверждаем, что следующая строка не начинается с [
и di git, где \R
соответствует последовательности новой строки в Unicode \[
Матч [
([\d :.-]+)
Захват группа 1 , соответствие любому из перечисленных ]
Матч ]
ERROR.*?
Совпадение с ошибкой и 0+ раз с любым символом, кроме новой строки (F:\S*)
Захват группа 2 , Совпадение F: и 0+ раз с непробельным символом (?sx).*?
Встроенный модификатор s
создание точки, совпадающей с новой строкой и x
для игнорирования пробела \b([a-zA-Z]*Exception)\b
Захват группа 3 , сопоставление 0+ раз с последующим символом a-zA-Z по исключению
Regex demo
Другой вариант без использования встроенного модификатора s
для приведения точки в точку новой строки может быть необязательным соответствие всех строк, которые не содержат исключений, после соответствия ERROR и F: part.
^(?!.*\R\[\d)\[([\d :.-]+)]ERROR.*?(F:\S*)(?:(?!.*Exception|.*\R\[\d).*\R)*+.*\b([a-zA-Z]*Exception)\b
Regex demo