Регулярные выражения в C#. Исключение подобных выражений

326
20 мая 2017, 16:34

Имеется следующий текст:

Running postupdate SQL scripts...
Executing script: Init!Checks.SQL
Выключен контроль целостности данных базы. Включить!
Msg 50000, Level 1, State 16, Line 2, Procedure '', Server 'dbs'
Выключено автоматическое создание статистик. Включить!
Msg 50000, Level 1, State 16, Line 2, Procedure '', Server 'dbs'
Выключен режим SNAPSHOT. Включить!
Msg 50000, Level 1, State 16, Line 2, Procedure '', Server 'dbs'
Error messages: 3
Queries count 15
Executing script: Common_MESSAGE.SQL
Error messages: 0
Queries count 43
Executing script: Common_TYPEDEF.SQL
Error messages: 0
Queries count 5
Executing script: Init_CommonRights.SQL
Error messages: 0
Queries count 32
Executing script: Init!Checks.SQL
Выключен контроль целостности данных базы. Включить!
Msg 50000, Level 1, State 16, Line 2, Procedure '', Server 'dbs'
Выключено автоматическое создание статистик. Включить!
Msg 50000, Level 1, State 16, Line 2, Procedure '', Server 'dbs'
Выключен режим SNAPSHOT. Включить!
Msg 50000, Level 1, State 16, Line 2, Procedure '', Server 'dbs'
Error messages: 3

Задача: выделить фрагменты между: Executing script: и Error messages: [1-9]

Если "Error messages: 0" - то фрагмент выделять не нужно.

Проверяю регулярки я тут.

Написал следующую: (Executing script:)[\w\W]*?(Error messages: [1-9])

Но она не обрабатывает вышеописанную ситуацию с "Error messages: 0". Вот наглядно:

!(https://cs7054.userapi.com/c836130/v836130547/4ca14/yWRiimEtREo.jpg)

Пока не могу сообразить, как мне исключить выделенные фрагменты. Спасибо за помощь.

Answer 1

В таких случаях необходимо использовать "жадный" "умеренный" квантификатор (англ. "tempered greedy token"):

(?s)Executing script:(?:(?!Executing script:).)*?Error messages: [1-9]
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^  

См. демо регулярного выражения. Тут точка находит любой символ кроме такого, который является началом подстроки Executing script:.

Здесь (?s) является строковой версией опции RegexOptions.Singleline, благодаря которой . также находит знаки перехода на новую строку (LF).

READ ALSO
Проверка, что файл скачался

Проверка, что файл скачался

Пишу автотест и мне надо дождаться пока файл скачается, как это сделать с использованием SeleniumЕсли не используя его, то какой оптимальный...

367
Плавная прокрутка

Плавная прокрутка

ScrollBar имеет особенность прокручивать блоками по 15-20 пикселейМне нужна плавная прокрутка по 1 пикселю (как, кстати, на этом сайте)

239
Двойное хэширование MD5

Двойное хэширование MD5

Делаю авторизацию в приложенииНа сайте пароль дважды шифруется MD5

332