Regex 用正则表达式解析电子邮件会话
我正在编写一个BI应用程序,需要从电子邮件会话中提取元数据。 也就是说,给我一个电子邮件线程,我希望提取所有参与者和对话的结构。例如,给定这样的对话:Regex 用正则表达式解析电子邮件会话,regex,email,Regex,Email,我正在编写一个BI应用程序,需要从电子邮件会话中提取元数据。 也就是说,给我一个电子邮件线程,我希望提取所有参与者和对话的结构。例如,给定这样的对话: From: me To: You CC: someone <Body> From: You To: Someone CC: Someone else <Body> 发件人:我 致:你 抄送:某人 发件人:你 致:某人 抄送:其他人 我想提取发送给“某人”的“你”和电子邮件,并将其抄送给“其他人”,所有这些都从“我
From: me
To: You
CC: someone
<Body>
From: You
To: Someone
CC: Someone else
<Body>
发件人:我
致:你
抄送:某人
发件人:你
致:某人
抄送:其他人
我想提取发送给“某人”的“你”和电子邮件,并将其抄送给“其他人”,所有这些都从“我”转发给“你”,并将抄送给“某人”
我的问题是,我需要处理不同的供应商
有人熟悉网络上某个地方的一组正则表达式来满足这些需求吗
谢谢大家! 如果您希望自己实现,请从这里开始:如果您希望自己实现,请从这里开始:我不理解您对“不同提供商”的意思。邮件标题如下。因此,作为正则表达式,您只需解析:
To: <contacts>
From: <contact>
Cc: <contacts>
现在,将前置到:
字符串:
\bTo: [A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b
从技术上讲,标题(如To:
)总是从行的开头开始,因此您可以执行以下操作:
^To: [A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b
如果需要提取电子邮件地址,则需要添加捕获组:
^To: ([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4})\b
但这将只捕获一个地址,因此您可能希望从此处扩展:
^To: ([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4})(,\s*[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4})*\b
这是一种非常幼稚的匹配多个地址的方法。您将在一个捕获组中拥有第一个地址,而在第二个组中拥有所有其他地址。更好的方法是与此相匹配。如果匹配,请删除前导的至:
,拆分其余部分并用逗号修剪
正如你所看到的,你正在打开一个小虫子罐。解析电子邮件并不像看上去那么简单。解析标题非常简单(基于上述示例)。然而,消息体是另一种野兽。几乎每个电子邮件客户机(Thunderbird、Outlook(express)、mutt等)处理这一问题的方式都略有不同。有时,新版本的行为与旧版本不同。这在很大程度上取决于客户端设置、系统区域设置等。用户是否发送UTF8,引用可打印,CP1252?引用标准:
注:本规范无意规定现场使用的内部格式,
预期支持的特定消息系统功能,或
创建或读取消息的用户界面程序的特征。此外
本文档未指定传输或传输的字符编码
存储也就是说,它没有指定使用的位数或这些位数的使用方式
专门通过导线传输或存储在磁盘上
您可能很幸运,因为发送电子邮件的客户端添加了一个标题,指定了编码,但没有强制它们这样做(AFAICS)
下一件大事是多部分消息。这也有点古怪
我的建议是使用现成的库来进行解析。我确信,大多数流行语言都有一个可用的库,使这项任务变得更加容易。我不明白你所说的“不同的提供者”是什么意思。邮件标题如下。因此,作为正则表达式,您只需解析:
To: <contacts>
From: <contact>
Cc: <contacts>
现在,将前置到:
字符串:
\bTo: [A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b
从技术上讲,标题(如To:
)总是从行的开头开始,因此您可以执行以下操作:
^To: [A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b
如果需要提取电子邮件地址,则需要添加捕获组:
^To: ([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4})\b
但这将只捕获一个地址,因此您可能希望从此处扩展:
^To: ([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4})(,\s*[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4})*\b
这是一种非常幼稚的匹配多个地址的方法。您将在一个捕获组中拥有第一个地址,而在第二个组中拥有所有其他地址。更好的方法是与此相匹配。如果匹配,请删除前导的至:
,拆分其余部分并用逗号修剪
正如你所看到的,你正在打开一个小虫子罐。解析电子邮件并不像看上去那么简单。解析标题非常简单(基于上述示例)。然而,消息体是另一种野兽。几乎每个电子邮件客户机(Thunderbird、Outlook(express)、mutt等)处理这一问题的方式都略有不同。有时,新版本的行为与旧版本不同。这在很大程度上取决于客户端设置、系统区域设置等。用户是否发送UTF8,引用可打印,CP1252?引用标准:
注:本规范无意规定现场使用的内部格式,
预期支持的特定消息系统功能,或
创建或读取消息的用户界面程序的特征。此外
本文档未指定传输或传输的字符编码
存储也就是说,它没有指定使用的位数或这些位数的使用方式
专门通过导线传输或存储在磁盘上
您可能很幸运,因为发送电子邮件的客户端添加了一个标题,指定了编码,但没有强制它们这样做(AFAICS)
下一件大事是多部分消息。这也有点古怪
我的建议是使用现成的库来进行解析。我确信,大多数流行语言都有一个可用的库,使这项任务更加容易。你在问不可能的问题。在这种情况下,您需要使用真正的解析器,而不仅仅是使用正则表达式构建一些东西 你可以看看这里的答案,有人试图用正则表达式做类似的事情,并评论这有多棘手。一定要读书
如果你想要一些测试数据来测试,你可以下载包含50万封电子邮件(400兆压缩)的,这些邮件是安然人在崩溃前发送/接收的。你在问不可能的事情。在这种情况下,您需要使用真正的解析器,而不仅仅是构建一些东西