Соответствие регулярному выражению для извлечения многострочных текстовых областей (C #) - PullRequest
2 голосов
/ 15 февраля 2011

Я хочу захватить текстовые области в большом текстовом блоке, созданном в следующем формате:

...
[region:region-name]
multi line
text block
[/region]
...
[region:another-region-name]
more
multi-line text
[/region]

У меня это почти сработало с

\[region:(?'link'.*)\](?'text'(.|[\r\n])*)\[/region\]

Это работает, если у меня только один регион во всем тексте. Но, когда есть несколько, это дает мне только один блок с каждым другим «регионом», включенным в «текст» этого. У меня есть ощущение, что это должно быть решено с использованием негативного взгляда в будущее, но, будучи непрофессионалом с регулярным выражением, я не знаю, как изменить вышеприведенное, чтобы сделать это правильно. Может кто-нибудь помочь?

Ответы [ 2 ]

4 голосов
/ 15 февраля 2011

Вы можете сделать это без оглядки:

\[region:(?'link'.*)\](?'text'(?s).*?)\[/region\]

Дополнительный ? делает квантификатор * ленивым, поэтому он будет соответствовать как можно меньшему числу символов. И (?s) позволяет точке совпадать с новой строкой после этой позиции, поэтому вам не нужно использовать конструкцию (.|[\r\n]) (альтернативой будет [\s\S]).

1 голос
/ 15 февраля 2011

Вам не нужен отрицательный прогноз, просто нужно изменить (?'text'(.|[\r\n])*) на «не жадный», чтобы он соответствовал первому экземпляру [/region], а не последнему.Вы можете сделать это, добавив ? после *, чтобы получился такой шаблон:

\[region:(?'link'.*)\](?'text'(.|[\r\n])*?)\[/region\]
...