Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 提取电子邮件数据的Regex模式_C#_Regex_Multiline_Multilinestring - Fatal编程技术网

C# 提取电子邮件数据的Regex模式

C# 提取电子邮件数据的Regex模式,c#,regex,multiline,multilinestring,C#,Regex,Multiline,Multilinestring,我正在从POP服务器检索原始文本(包括标题和消息)。我需要捕获标头之后的所有内容,标头与用户消息之间以一条空行终止 同时,如果是回复,我想忽略原始消息中的任何内容。我正在解析的电子邮件的回复开始 ------Original Message------ 示例电子邮件可能如下所示 返回路径:… … 更多电子邮件元数据: regex land的您好,很高兴收到您的来信。 ------原始消息------- 元数据:… 嘿regex伙计你能帮我吗?谢谢 真诚地,谢谢你 我需要摘录“Hello fr

我正在从POP服务器检索原始文本(包括标题和消息)。我需要捕获标头之后的所有内容,标头与用户消息之间以一条空行终止

同时,如果是回复,我想忽略原始消息中的任何内容。我正在解析的电子邮件的回复开始

------Original Message------
示例电子邮件可能如下所示

返回路径:…

更多电子邮件元数据:

regex land的您好,很高兴收到您的来信。
------原始消息-------
元数据:…

嘿regex伙计你能帮我吗?谢谢

真诚地,谢谢你

我需要摘录“Hello from regex land,我很高兴听到你的消息。”以及原始消息之前的任何其他文本/行

我现在正在使用这个正则表达式(C#在多行模式下),它似乎可以工作,除非它捕获原始消息,如果正文是空的。我宁愿用一个空白字符串来代替

^\s*$\n(.*)(\n------Original Message------)?
编辑

我没有否决过任何人,如果你碰巧投了否决票,通常添加评论会很有帮助。

为什么不使用?使用正则表达式执行此操作是一种错误的方法,最好使用专用的电子邮件处理程序….

原因是括号内有一个额外的
\n
。如果正文为空,则没有额外的换行符。因此,请尝试以下方法:

^\s*$\r\n(.*)(^------Original Message------$)?
如果您不希望换行符位于正文的末尾,您仍然可以在匹配的零件上使用
string.Trim()


注意:这假设输入使用了
\r\n
行终止符(根据MIME标准,这在电子邮件头中是必需的)。

您需要将
(\n------原始消息----)
替换为
(?=(\n------原始消息----)
以避免返回该部分,只是为了确保它在那里

我使用的是一个POP3客户端,我被告知要使用它,而不是将消息作为对象检索(我更喜欢),我只能检索每条消息的原始文本。否则这就不是问题了。。。使用正则表达式来处理这个问题是没有意义的。。。您使用的是什么pop3客户端-pop3客户端应该负责处理消息体等。。。否则就不需要正则表达式了!!谢谢你帮助汤米。那么,让我们从这个角度来看。我有PO3邮件客户端代码,我正在扩展它,以便为从POP服务器检索到的每条邮件实例化一个MailMessage对象。现在我正在写一些方法来提取原始文本的一部分,以使对象的属性更为丰富。我同意。。如果是这样的话,所有这些都不需要:)tommie,我想我可能对正则表达式捕获要求太高了。我要试试DotnetOpenMail。谢谢你给我指出了正确的方向。这会产生同样的结果。@jlafay:是的,对不起。它应该是
\r\n
,而不仅仅是
\n
。更新了答案。这样更好。问题是,它不能解释不包含“原始消息”的电子邮件。不过要近得多,谢谢。除了原始消息,还有什么替代终止符呢?我只希望它在原始消息行之前停止捕获。并不是所有的电子邮件都会有这句话,只是大多数都有。因此,如果这一行不存在,那就是一封新的电子邮件,而不是回复。我要把所有这些都抓起来。谁给了我否决票,原因是什么?!也许可以尝试
(?=(\n------原始消息-------|$)
,它会将您带到消息的末尾。