Регулярное выражение: сопоставление строк между двумя ключевыми словами, смешанных с бесполезными данными в нескольких строках - PullRequest
2 голосов
/ 03 ноября 2019

Я пытаюсь использовать регулярное выражение NP ++ для анализа данных из файла с входными данными:

badstring ---
useless data
keyword1 ---
usless data
string 1 ---
random number of useless lines of characters across newlines
string 2 ---
more useless stuff
keyword2 ---
useless data
dumb badstring keyword2 ---

output:

string 1, string 2

Например, sake, string1, string 2 и badstringsвсе они имеют одинаковый формат, поэтому я исключительно хочу найти строку1 и строку2 ТОЛЬКО между ключевым словом1 и ключевым словом 2.

Самое близкое, что мне удалось получить:

keyword1\r\n((.|\r\n)+?)\r\n(.+) ---\r\n((.|\r\n)+?)\r\n(.+) ---\r\n((.|\r\n)+?)keyword2

проблема в том, чтоЯ не знаю, сколько строк мне нужно перехватить, поэтому мне нужно рекурсивно искать по наибольшему количеству возможных строк, и потому что я использую ((. | \ R \ n) +?), Чтобы сопоставить все, что всегда соответствует, кромеключевое слово, поэтому, когда я запускаю keyword1 ---((.|\r\n)+?)(.+) ---((.|\r\n)+?)(.+) ---((.|\r\n)+?)(.+) ---((.|\r\n)+?)keyword2 ---, чтобы найти 3 строки, он выбирает за пределами ключевого слова2, потому что следующий раздел также содержит ключевое слово2 вместо возврата без совпадений. Точно так же, если я делаю это, ища слишком много строк, он будет зацикливаться и выбирать весь файл. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 03 ноября 2019

Как насчет использования (*SKIP)(*F) для пропуска чего-либо от начала до keyword1 и всего от keyword2 до конца строки. Вопрос не звучит так, как будто нужна рекурсия.

(?s:\A.*?^keyword1|^keyword2.*)(*SKIP)(*F)|^.*?(?=\h---)

См. Эту демонстрацию на regex101

0 голосов
/ 03 ноября 2019

Может быть, я что-то упускаю, но разве вы не можете просто использовать прямолинейное

keyword1[\s\S]*(string1)[\s\S]*(string2)[\s\S]*keyword2

Это должно делать то, что вы описываете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...