【问题标题】:Reflex to Delete all text except between two lines反射删除除两行之间的所有文本
【发布时间】:2018-04-24 15:32:14
【问题描述】:

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

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

我需要将文本保留在“Message-ID”和“Received:”之间

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

我有一个错误“找不到文本”

【问题讨论】:

  • 此文本可以在您的文件中出现多次吗?我的意思是,您是否希望在多个 message-id/received 标记之间提取 multiple 文本?或者,这里只有一次捕获?
  • keep 相对于整个样本是什么意思?
  • 嗨蒂姆。文件中有多个捕获。我只需要 Message-ID: 和 Received: 之间的文本:
  • 您可以尝试(?s)(?<=Message-ID:)(.*?)(?=Received:)|. 并替换为(?{1}$1\n:)。它应该适用于较小的文件。这也将删除Message-ID:Received:,顺便说一句。

标签: regex notepad++ multiline


【解决方案1】:

如果您只出现一次此文本,您的问题将很简单,并且您只需提取标记内的文本一次。在这种情况下,类似以下的方法会起作用:

Message-ID:(.*?)Received:

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

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

查找此模式,然后替换为$1。请注意,点必须处于换行模式,这意味着 .* 跨换行匹配(此模式在演示中启用)。

Demo

【讨论】:

  • 嗨蒂姆.. 我收到一个错误“找不到文本”。顺便说一句,我正在使用记事本++
  • @Prasad 您需要在正则表达式模式下进行替换,并设置点以匹配换行符。
【解决方案2】:

你可以使用

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

替换为(?1$1\n)

详情

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

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

【讨论】:

  • 这个may not work as intended 应该消息和收到的标记出现在任何其他上下文中。
  • @TimBiegeleisen 您正在使输入复杂化,而无需这样做,因为没有这样的要求。
【解决方案3】:

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

有时回答问题是值得的。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-20
    • 2011-01-09
    • 1970-01-01
    • 2012-06-21
    • 2017-12-03
    • 1970-01-01
    • 2022-11-18
    相关资源
    最近更新 更多