Reflex для удаления всего текста, кроме двух строк - PullRequest
0 голосов
/ 24 апреля 2018

Я пытаюсь извлечь содержимое между двумя строками строки. Вот как выглядит текст

   Hhhshhajsjsjsj
    Hshhejjsjsmk
    Hahjajajajajja
     Message-ID: b123467
       abc
       def
       Kjhshjsjs
     Received:
  Hdjjddjdjdjdjd

Мне нужно оставить текст между «Message-ID» и «Получено»:

Я пробовал '@ “(?: \ G (?! \ A) [X-Message-ID:) \ r? \ N (. *) (?> \ R? \ NПолучено: (? = S \ г? $))?

У меня ошибка "не могу найти текст"

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

Вы можете использовать

(?s)Message-ID:(.*?)Received:|.

Заменить на (?1$1\n).

Подробности

  • (?s) - включить . соответствует опции новой строки
  • Message-ID: - буквенная подстрока
  • (.*?) - Группа 1: любые 0+ символов, как можно меньше
  • Received: - aбуквенная подстрока
  • | - или
  • . - любой 1 символ.

Замена (?1$1\n) означает, что если группа 1 совпадает, заменить наСгруппируйте 1 и добавьте после нее новую строку, в противном случае просто удалите совпадение.

enter image description here

0 голосов
/ 26 апреля 2018

What does keep mean relative to the entire sample ? – sln yesterday

Иногда стоит отвечать на вопросы.

Найти (?s)\G(?:.*?Message-ID:(.*?)Received:|.*)
Заменить $1

https://regex101.com/r/E3c3Ot/1

0 голосов
/ 24 апреля 2018

Ваша проблема была бы простой, если бы у вас было только одно вхождение этого текста, и вам нужно было только один раз извлечь текст внутри маркеров. В этом случае будет работать что-то вроде следующего:

Message-ID:(.*?)Received:

Но если вы ожидаете, что в вашем файле будет несколько совпадений, вам нужно проделать дополнительную работу. Вот один шаблон, который должен работать:

(?:(?!Message-ID:).)*Message-ID:((?:(?!Received:)(?!Message-ID:).)*)Received:

Сделайте поиск по этому шаблону, а затем замените на $1. Обратите внимание, что точка должна находиться в режиме новой строки, это означает, что .* соответствует символам новой строки (этот режим включен в демонстрационной версии).

Демо

...