我正在寻找一个多行正则表达式,它将匹配空行之后的出现。例如,给定下面的示例电子邮件,我想匹配“发件人:亚历克斯”。 ^From:\s*(.*)$
可以匹配任何 From 行,但我希望它仅限于正文中的行(第一个空白行之后的任何内容)。
收到:从服务器 日期:今天 致:特德 来自:詹姆斯 主题:[转发:嗨] 供参考 - - - 转发消息 - - - 致:詹姆斯 来自:亚历克斯 主题:你好 聚会!
我正在寻找一个多行正则表达式,它将匹配空行之后的出现。例如,给定下面的示例电子邮件,我想匹配“发件人:亚历克斯”。 ^From:\s*(.*)$
可以匹配任何 From 行,但我希望它仅限于正文中的行(第一个空白行之后的任何内容)。
收到:从服务器 日期:今天 致:特德 来自:詹姆斯 主题:[转发:嗨] 供参考 - - - 转发消息 - - - 致:詹姆斯 来自:亚历克斯 主题:你好 聚会!
我不确定 C# 正则表达式的语法,但你应该有一种方法可以锚定到字符串的开头(而不是行的开头,例如 ^)。在我的示例中,我将其称为“\A”:
\A.*?\r?\n\r?\n.*?^From:\s*([^\r\n]+)$
确保打开多行匹配选项,但它有效,以制作“。” 匹配\n
为此类工作编写复杂的正则表达式是 IMO 的一个坏主意。最好结合几个简单的查询。例如,首先搜索“\r\n\r\n”以找到正文的开头,然后在正文上运行简单的正则表达式。
这是使用后视断言。第 1 组将为您提供“发件人”行,第 2 组将为您提供实际值(在您的示例中为“Alex”)。
(?<=\n\n).*(From:\s*(.*?))$
\s{2,}.+?(.+?From:\s(?<Sender>.+?)\s)+?
\s{2,}
匹配至少两个空格字符,这意味着您的第一个 From: James 不会命中。然后只需寻找下一个“From:”并从那里开始捕获。
将此与RegexOptions.SingleLine
and一起使用RegexOptions.ExplicitCapture
,这意味着外部组不会命中。