RegEx соответствует тексту между разделителями - PullRequest
12 голосов
/ 13 сентября 2010

Мне нужно регулярное выражение для извлечения текста внутри разделителя, но у меня возникают проблемы с извлечением значения внутри разделителя [ДАННЫЕ n] и [КОНЕЦ ДАННЫХ]

Вот мое регулярное выражение

(?<=\[DATA\s+\d+\]).*(?=\[END DATA\])

Вот пример данных, которые я хочу сопоставить

Некоторый текст здесь

[DATA 1]
data one 
some more data
[END DATA]
[DATA 2]
data two
more data
data
[END DATA]
[DATA n]
more data 
data 
[END DATA]

Ответы [ 4 ]

21 голосов
/ 13 сентября 2010

Вы, кажется, используете функции регулярных выражений, такие как lookbehind и lookahead, когда они вам действительно не нужны. Попробуйте:

\[DATA\s+\d+\](.*?)\[END DATA\]

В этом регулярном выражении есть только одна группа захвата, (.*?). После этого искомый результат должен быть в группе захвата 1.

Также обратите внимание, что я использовал не жадное совпадение .*?, которое будет соответствовать до первого следующего экземпляра [END DATA] Без этого, если вы используете только .*, вы захватите все до последний [END DATA].

6 голосов
/ 13 сентября 2010

В регулярном выражении текст [ между ] называется классом символов, а механизмы регулярного выражения будут соответствовать одному символам в скобках.Вам просто нужно поставить обратную косую черту, чтобы сделать их буквальными:

(?<=\[DATA\s+\d+\]).*(?=\[END DATA\])
4 голосов
/ 13 сентября 2010

Специальный символ точки по умолчанию не соответствует символу новой строки. Убедитесь, что вы используете однострочный модификатор для реализации регулярных выражений, или используйте [\S\s]*? вместо .*?

Подробнее см. http://www.regular -expressions.info / modifiers.html и http://www.regular -expressions.info / dot.html .

1 голос
/ 13 сентября 2010

Используйте \ для выхода из символа.

\[DATA\s\d\]+([^\[]+)\[[^\]]+\]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...