反射删除除两行之外的所有文本

时间:2018-04-24 15:32:15

标签: regex notepad++ multiline

我正在尝试提取两行字符串之间的内容。这是文本的外观

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

我需要在'Message-ID'和'Received:'

之间保留文本

我试过'@'(?:\ G(?!\ A)[X-Message-ID:] \ r?\ n(。*)(?> \ r?\ n接收:(?= S \ r?$))?“

我收到错误'找不到文字'

3 个答案:

答案 0 :(得分:0)

如果您只有一次出现此文本,您的问题就会很简单,而您只需要在标记内提取一次文本。在这种情况下,类似下面的内容将起作用:

Message-ID:(.*?)Received:

但是如果你希望文件中有多个匹配项,那么你需要做更多的工作。这是一个应该起作用的模式:

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

找到此模式,然后替换为$1。请注意,dot必须采用换行模式,这意味着.*匹配新行(此模式已在演示中启用)。

Demo

答案 1 :(得分:0)

您可以使用

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

替换为(?1$1\n)

<强>详情

  • (?s) - 启用.匹配换行符选项
  • Message-ID: - 文字子字符串
  • (.*?) - 第1组:尽可能少的0个字符
  • Received: - 文字子字符串
  • | - 或
  • . - 任意1个字符。

(?1$1\n)替换表示如果组1匹配,则替换为组1并在其后添加换行符,否则,只删除匹配。

enter image description here

答案 2 :(得分:0)

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

有时回答问题是值得的。

查找(?s)\G(?:.*?Message-ID:(.*?)Received:|.*)
替换$1

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