2014-11-09 8 views
0

В настоящее время я пытаюсь извлечь следующее в виде абзацев с использованием Regex внутри .Net 3.5 В начале каждого абзаца обозначается фраза, обозначающая начало последовательности, в данном случае StartMarker. После этого переменное количество строк, каждое с линией (\n) в конце. Конец абзаца обозначается пустой строкой.Многострочное регулярное выражение .Net

Пример входных данных следующим образом

StartMarker: 
Line1 
Line2 
Line3 
Line4 
Line5 

StartMarker: 
Line6 
Line7 
Line8 

StartMarker: 
Line9 
Line10 

Это должно дать следующие матчи:

матча 1

StartMarker: 
Line1 
Line2 
Line3 
Line4 
Line5 

матча 2

StartMarker: 
Line6 
Line7 
Line8 

матч 3

StartMarker: 
Line9 
Line10 

Я пробовал (^StartMarker.*\n), но это соответствует только первой строке в каждом сегменте. Я использовал это с включенными глобальными и многострочными параметрами.

Я думал что-то вроде (^StartMarker.*)([\s\S]+\n), но это не работает [\s\S]+ жадный и захватывает все после StartMarker до конца файла. Поэтому я действительно не уверен, как действовать дальше. Любая помощь здесь будет оценена.

+0

'' 'после' + 'делает его неживым. – Rawling

+0

Спасибо. Я просто попробовал это. (^ StartMarker:) ([\ s \ S] + \ п?). Итак, теперь он захватывает все, начиная с StartMarker: до конца следующей строки. Любые идеи о том, как я могу его захватить до пустой строки? – Dee

+0

С этим не-жадным битом, я думаю, что я это обработал.^StartMarker: [\ s \ S] +^\ п. Спасибо за это. – Dee

ответ

0

использовать этот шаблон

(StartMarker:[\s\S]*?)(?=(?:\r?\n)+StartMarker:|$) 

Demo

+0

Сначала я подумал, что это неверно. Но я вижу, что вы используете его в режиме SingleLine. Он тоже работает! Поскольку я использую многострочный режим, будет работать следующее: StartMarker: [\ s \ S] +?^\ N. Легче на глазах. Для меня хотя бы :). Спасибо за помощь. – Dee

+0

@ Dee: Это не режим Singleline. Это регулярное выражение находится в режиме по умолчанию, где точка ('.') Соответствует любому символу, кроме строки, и привязки ('^' и '$') соответствуют только началу и концу всей строки. Singleline позволяет '.' сопоставлять что-либо, в то время как Multiline превращает'^'и' $ 'в * start-of-line * и * end-of-line * anchors. Ничего не мешает вам использовать оба режима одновременно: '(? Ms)^StartMarker:. *? (? = (?: \ R? \ N) + StartMarker: | \ Z)' –

0

если ваша картина Absolute использование этого Regex:

(StartMarker:(?:\sLine\d+)*) 

в противном случае, если ваша линия может быть что-нибудь использовать этот Regex:

(StartMarker:(?:\s.+)*) 
Смежные вопросы