0

今天早上试图让这项工作变得疯狂。

我正在使用电子邮件的边界字符串尝试将其拆分为 text/plain 和 text/html 部分。我知道有一些库可以做到这一点,但它们都不能在 WinRT 中工作。

这就是我所拥有的。我很讨厌正则表达式,所以它可能是各种错误的:

样本数据

From: Rory <me@gmail.ftw>
Date: Mon, 8 Oct 2012 17:05:48 +0100
Message-ID: <a1b2c3d4e5f6g7h8i9j10a1b2c3d4e5f6g7h8i9j10@mail.gmail.ftw>
Subject: Subject of my email
To: me@gmail.ftw

Content-Type: multipart/alternative; boundary=bcaec54fbd3a824f3504cb8e677d

--bcaec54fbd3a824f3504cb8e677d

Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

text part of email

--bcaec54fbd3a824f3504cb8e677d
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

<html>
    <strong>HTML part of email</strong>
</html>

--bcaec54fbd3a824f3504cb8e677d--

我正在尝试提取

  1. --bcaec54fbd3a824f3504cb8e677d 边界标记之间的两个部分
  2. 每个部分的 Content-Type、charset 和 Content-Transfer-Encoding
  3. 内容本身(在 Content-Transfer-Encoding 之下,直到下一个边界

正则表达式代码

string b = "bcaec54fbd3a824f3504cb8e677d";
Regex r = new Regex(
"(--" + b + "\r?\nContent-Type: (text/plain|text/html); charset=(.+?)\r?\nContent-Transfer-Encoding: (.+?)\r?\n(.*?--" + b + "))", 
RegexOptions.Singleline); 

仅当我在末尾省略边界字符串时,这才匹配这两个部分。如果我包含它,它只匹配第一部分。在我开始砸东西之前,有人可以帮我吗

更新: 添加样本数据,减少

4

2 回答 2

1

使用正则表达式模式

"(--" + b + "(?:\r?\n)+Content-Type:\s+([^;]+);\s+charset=([^\s\n\r]+)(?:\r?\n)+Content-Transfer-Encoding:\s([^\s\n\r]+)(?:\r?\n){2,}.*?)(?=\r?\n--" + b + "(?:--)?\r?\n)"

带有RegexOptions.Singleline选项/标志。

于 2012-10-22T13:45:07.963 回答
0

用 SingleLine 选项试试这个正则表达式:

--bcaec54fbd3a824f3504cb8e677d\r?\n\s*(Content-Type:\s*([^;]+);\s*charset=(\S+)\r?\n+Content-Transfer-Encoding:\s*(\S+)\r?\n\s*(.*?))\s*(?=--bcaec54fbd3a824f3504cb8e677d)

RegexHero进行测试

于 2012-10-22T14:09:36.287 回答