регулярное выражение извлекает несколько строк, содержащих трассировку стека исключений

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

Verbose;MyComputer;07.02.2017 12:42:48,831;Area=;SubArea=;SessionId=;StepId;User=;Message=Repository CareProviderRepository:START GetCareProviderByZsrMethod with ZSR: H110702
Error;MyComputer;07.02.2017 12:42:51,409;Area=;SubArea=;SessionId=;StepId;User=;Message=Repository CareProviderRepository:Fail to get CareProviderMethod with Zsrnumber: H110702
Error;MyComputer;07.02.2017 12:42:51,933;Area=;SubArea=;SessionId=;StepId;User=;Message=Services:Exception: System.Data.Entity.Core.EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details. ---> System.Data.SqlClient.SqlException: Invalid column name 'Name_DE'.
Invalid column name 'Name_FR'.
Invalid column name 'Name_IT'.
Invalid column name 'DefaultText'.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
Verbose;MyComputer;07.02.2017 12:42:52,361;Area=;SubArea=;SessionId=;StepId;User=;Message=Business NetworkManager:START Get: Network with Code: 95; withNetworkMembers: False
Verbose;MyComputer;07.02.2017 12:42:52,369;Area=;SubArea=;SessionId=;StepId;User=;Message=Repository NetworkRepository:START Get: 95
Error;MyComputer;07.02.2017 12:42:51,933;Area=;SubArea=;SessionId=;StepId;User=;Message=Services:Exception: System.Data.Entity.Core.EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details. ---> System.Data.SqlClient.SqlException: Invalid column name 'Name_DE'.
Invalid column name 'Name_FR'.
Invalid column name 'Name_IT'.
Invalid column name 'DefaultText'.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
Verbose;MyComputer;07.02.2017 12:42:52,361;Area=;SubArea=;SessionId=;StepId;User=;Message=Business NetworkManager:START Get: Network with Code: 95; withNetworkMembers: False
Verbose;MyComputer;07.02.2017 12:42:52,369;Area=;SubArea=;SessionId=;StepId;User=;Message=Repository NetworkRepository:START Get: 95

Вот мое регулярное выражение: (Error;(?:.*\r?\n?)\s)

Это регулярное выражение выбирает только одну строку или ошибку. На самом деле мне нужно регулярное выражение, которое может выбрать мне 3 ошибки (первая ошибка - однострочная, а затем 2 ошибки - многострочные).

Мое регулярное выражение не экранирует CRLF или новую строку в конце строки ошибки.

Конечные границы для каждой записи: Debug;, Verbose;, Info; или Error;.

Любые предложения?


person sezanawa    schedule 11.07.2017    source источник
comment
Что-то подобное этому?   -  person Wiktor Stribiżew    schedule 11.07.2017
comment
@WiktorStribiżew в этом конкретном примере можно отличить Errors от Verboses: regex101.com/r/d67ua5 /1   -  person Oleksii Filonenko    schedule 11.07.2017
comment
вопрос: какие строки действительно относятся к ошибке? Виктор предложил извлечь все до следующей «Ошибки». Это правильно?   -  person Serge    schedule 11.07.2017
comment
@BrightOne Да, хотя ; тоже должен стоять после Error. Во всяком случае, звучит довольно непонятно для меня.   -  person Wiktor Stribiżew    schedule 11.07.2017
comment
@WiktorStribiżew идеальное решение. Это работает для меня. он должен начать извлечение со слова Error; и заканчиваться до следующего появления таких слов, как Error;|Verbose;|Info;|Debug; и т.д. Большое спасибо   -  person sezanawa    schedule 11.07.2017


Ответы (1)


Вы можете использовать следующее регулярное выражение

/^Error;.*(?:\r?\n(?!Error;|Verbose;|Info;|Debug;).*)*/gm

Пожалуйста, адаптируйте обозначения к используемому вами языку.

Подробнее

  • ^ - start of a line (mmodifier makes the^` соответствует началу строки, а не всей строки)
  • Error; — соответствует буквальной подстроке Error;
  • .* — соответствует остальной части строки
  • (?:\r?\n(?!Error;|Verbose;|Info;|Debug;).*)* - 0+ sequences of:
    • \r?\n(?!Error;|Verbose;|Info;|Debug;) - a line break not followed with any of the alternatives inside parentheses
    • .* - вся линия.
person Wiktor Stribiżew    schedule 11.07.2017