Текст соответствия RegEx между разделителями
Мне нужно регулярное выражение, которое извлекает текст внутри разделителя, но я
проблема с извлечением значения внутри разделителя [DATA n] и [END DATA]
Здесь мое регулярное выражение
(?<=\[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]
Ответы
Ответ 1
Похоже, вы используете функции регулярных выражений, такие как lookbehind и lookahead, когда они вам действительно не нужны. Попробуйте:
\[DATA\s+\d+\](.*?)\[END DATA\]
В этом регулярном выражении есть только одна группа захвата (.*?)
. После этого результат, который вы ищете, должен быть в группе захвата 1.
Обратите внимание, что я использовал нежеланное совпадение .*?
, которое будет совпадать до первого следующего экземпляра [END DATA]
. Без этого, если вы используете только .*
, вы будете записывать все до последнего [END DATA]
.
Ответ 2
В regex текст [
между ]
называется символьным классом, а двигатели регулярных выражений будут соответствовать только одному символов между скобками. Вам просто нужно поставить обратную косую черту, чтобы сделать их буквальными:
(?<=\[DATA\s+\d+\]).*(?=\[END DATA\])
Ответ 3
Специальный символ точки не соответствует символам новой строки по умолчанию. Убедитесь, что вы используете однострочный модификатор для вашей реализации регулярного выражения или используйте [\S\s]*?
вместо .*?
См. http://www.regular-expressions.info/modifiers.html и http://www.regular-expressions.info/dot.html для деталей.
Ответ 4
Используйте символ\для выхода.
\[DATA\s\d\]+([^\[]+)\[[^\]]+\]