正则表达式-删除第一个比赛之前的所有内容

时间:2018-06-22 09:23:35

标签: regex

真的为此挣扎。我需要一个正则表达式来从电子邮件中删除“主题/至/从/日期”字段,但保留邮件链中的所有先前的“主题/至/从/日期”字段条目。例如:

Subject: RE: Test mail
From: test@stackoverflow.com
To: test@test.com
Date: 22/06/2018 10:00:00

This is the body of e-mail #3.

Subject: RE: Test mail
From: test@test.com
To: test@stackoverflow.com
Date: 22/06/2018 09:55:00

This is the body of e-mail #2.

Subject: Test mail
From: test@stackoverflow.com
To: test@test.com
Date: 22/06/2018 09:50:00

This is the body of e-mail #1.

我希望正则表达式只删除要给出的前五行:

This is the body of e-mail #3.

Subject: RE: Test mail
From: test@test.com
To: test@stackoverflow.com
Date: 22/06/2018 09:55:00

This is the body of e-mail #2.

Subject: Test mail
From: test@stackoverflow.com
To: test@test.com
Date: 22/06/2018 09:50:00

This is the body of e-mail #1.

不幸的是,我不能写任何专门删除前五行的内容,因为可能还有CC字段;这意味着可能是六行。

因此,它需要匹配“ Date:”的第一个实例,直到该行的末尾并删除之前的所有内容。任何想法将不胜感激;我最接近的是不幸的是与“ Date:”的两个实例匹配的下方。

[\s\S]*.*Date:.*[\s\S]

3 个答案:

答案 0 :(得分:0)

正则表达式应按以下方式构造:

  • 从字符串的开头开始。
  • 接受任何从“日期:”开始的内容。
  • 接受此行的其余部分。
  • 接受任意数量的以下\n个字符(此行的末尾和空行)。

没有g(全局)选项,因为您只想执行匹配。

因此,可能的解决方案之一如下:

/\A.+?^Date: [^\n]+\n+/ms

详细信息:

  • m选项-多行(^$也匹配行的开头/结尾)。
  • s选项-单行(.也与\n匹配)。
  • \A-整个字符串的开头。
  • .+?-任意数量的字符(由于s选项,包括\n)。
  • ^-行的开头(由于m选项)。
  • Date:-“日期”行的开头。
  • [^\n]+-实际日期字段,除\n以外的任何其他字符。
  • \n+-行尾和空行之后。

由于您未指定宿主语言或正则表达式版本, 我假设PCRE支持所有使用的功能。

答案 1 :(得分:0)

要匹配文本的第一部分直到Date:并选择该行,您可以使用:

^Subject:[\s\S]+?^Date:[^\r\n]+\s*

说明

  • ^从行首开始
  • Subject:字面上匹配
  • [\s\S]+?将空白字符或非空白字符匹配一次或多次非贪婪
  • ^Date:匹配行的开头,后跟Date:
  • [^\r\n]+一次或多次不匹配换行符的回车符
  • \s*匹配零个或多个空白字符

请注意,在该示例中,全局标记为关闭状态,仅选择单个匹配项。

使用[\s\S]+?的替代方法可能是使用modifier (?s),让点与所有字符匹配,包括换行符。

(?s)^Subject:.+?^Date:[^\r\n]+\s*

然后,例如,您可以将匹配项替换为空字符串,或捕获(第一个)捕获组中的其余字符:

^Subject:[\s\S]+?^Date:[^\r\n]+\s*([\s\S]+)(如果使用pcre,而不是捕获组,则可以使用\K[\s\S]+

答案 2 :(得分:0)

^.*?\n\n(.*)(带有选项(gms))将捕获组1中所需的输出。

Try it out here

或者,带有选项(ms)的^.*?\n\n仅匹配要删除的文本。

Try it out here

这两个正则表达式都依赖于匹配第一个空行。这意味着,即使有多余的字段(例如CC字段),该方法仍然可以使用。