真的为此挣扎。我需要一个正则表达式来从电子邮件中删除“主题/至/从/日期”字段,但保留邮件链中的所有先前的“主题/至/从/日期”字段条目。例如:
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]
答案 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中所需的输出。
或者,带有选项(ms)的^.*?\n\n
仅匹配要删除的文本。
这两个正则表达式都依赖于匹配第一个空行。这意味着,即使有多余的字段(例如CC字段),该方法仍然可以使用。