Regex 要在空行后匹配的多行C#正则表达式

Regex 要在空行后匹配的多行C#正则表达式,regex,Regex,我正在寻找一个多行正则表达式,它将匹配一个空行之后的引用。例如,给出下面的示例电子邮件,我想匹配“发件人:Alex”^From:\s*(.*)$用于匹配任何From行,但我希望它仅限于正文中的行(第一个空行之后的任何行) 接收:来自服务器 日期:今天 致:特德 发件人:詹姆斯 主题:[前进:嗨] 供参考 -----转发消息----- 致:詹姆斯 发件人:亚历克斯 主题:嗨 聚会! 在我看来,为这样的工作编写复杂的正则表达式是个坏主意。最好将几个简单的查询组合起来。例如,首先搜索“\r\n\r\n

我正在寻找一个多行正则表达式,它将匹配一个空行之后的引用。例如,给出下面的示例电子邮件,我想匹配“发件人:Alex”<代码>^From:\s*(.*)$用于匹配任何From行,但我希望它仅限于正文中的行(第一个空行之后的任何行)

接收:来自服务器 日期:今天 致:特德 发件人:詹姆斯 主题:[前进:嗨] 供参考 -----转发消息----- 致:詹姆斯 发件人:亚历克斯 主题:嗨 聚会!
在我看来,为这样的工作编写复杂的正则表达式是个坏主意。最好将几个简单的查询组合起来。例如,首先搜索“\r\n\r\n”以查找正文的开头,然后在正文上运行简单的正则表达式。

我不确定C#正则表达式的语法,但您应该有办法定位到字符串的开头(而不是像^这样的行的开头)。在我的示例中,我将其称为“\A”:

\A.*?\r?\n\r?\n.*?^From:\s*([^\r\n]+)$

请确保启用多行匹配选项,无论该选项如何工作,以使“.”匹配\n

这是使用查找后断言。第1组将给出“From”行,第2组将给出实际值(“Alex”,在您的示例中)

(?
\s{2,}.+?(.+?From:\s(?.+?)\s)+?
\s{2,}
至少匹配两个空白字符,表示您的第一个From:James不会命中。然后只需查找下一个“From:”并从那里开始捕获


RegexOptions.SingleLine
RegexOptions.ExplicitCapture
一起使用,这意味着外部组不会命中。

谢谢。我需要的是也打开SingleLine模式,并使用。*?而不是。*。
\A.*?\r?\n\r?\n.*?^From:\s*([^\r\n]+)$
(?<=\n\n).*(From:\s*(.*?))$
\s{2,}.+?(.+?From:\s(?<Sender>.+?)\s)+?