Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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
Regex 用正则表达式解析电子邮件会话_Regex_Email - Fatal编程技术网

Regex 用正则表达式解析电子邮件会话

Regex 用正则表达式解析电子邮件会话,regex,email,Regex,Email,我正在编写一个BI应用程序,需要从电子邮件会话中提取元数据。 也就是说,给我一个电子邮件线程,我希望提取所有参与者和对话的结构。例如,给定这样的对话: From: me To: You CC: someone <Body> From: You To: Someone CC: Someone else <Body> 发件人:我 致:你 抄送:某人 发件人:你 致:某人 抄送:其他人 我想提取发送给“某人”的“你”和电子邮件,并将其抄送给“其他人”,所有这些都从“我

我正在编写一个BI应用程序,需要从电子邮件会话中提取元数据。 也就是说,给我一个电子邮件线程,我希望提取所有参与者和对话的结构。例如,给定这样的对话:

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兆压缩)的,这些邮件是安然人在崩溃前发送/接收的。

你在问不可能的事情。在这种情况下,您需要使用真正的解析器,而不仅仅是构建一些东西