3

我正在尝试找出 Ruby 1.8.7 上的正则表达式,用于从电子邮件中删除线程。为此,我需要删除与线程模式匹配的邮件边界之间的所有内容,例如,在 Mac Mail 上,我需要删除粗体文本(示例 HTML 已简化以避免使用大量空间,真实邮件的 HTML远没有那么简洁):

发件人:XXXX
...邮件标题...
内容类型:多部分/替代;
  边界="苹果邮件=_EFA7D6C2-C778-4C8E-AA13-C97DF1FA9036"
...更多邮件标题...

--Apple-Mail=_EFA7D6C2-C778-4C8E-AA13-C97DF1FA9036
内容传输编码:quoted-printable
内容类型:文本/纯文本;
  charset=us-ascii

从 Mac Mail 添加的新评论

2012 年 6 月 12 日 12:51,XXXX@example.com 写道:

> 线程
> 正文
> 成为
> 删除
>=20

--Apple-Mail=_EFA7D6C2-C778-4C8E-AA13-C97DF1FA9036
内容传输编码:quoted-printable
内容类型:文本/html;
  charset=us-ascii

<html>...很多HTML...

<span>2012 年 6 月 12 日 12:51,XXXX@example.com 写道:</span>

<span> 线程</span>
<span> 文本 </span>
<span> 是 </span>
<span> 已移除 </span>
<span>=20 </span>
</html>=

--Apple-Mail=_EFA7D6C2-C778-4C8E-AA13-C97DF1FA9036--

我认为可以捕获所需文本的正则表达式是:

--Apple-Mail=_EFA7D6C2-C778-4C8E-AA13-C97DF1FA9036.+?(\bOn.+?)(?!--Apple-Mail=_EFA7D6C2-C778-4C8E-AA13-C97DF1FA9036)

但这在第一个"On"之前从边界捕获是行不通的。

4

2 回答 2

1

好的,所以解决方案非常简单,我最终得到了如下表达式:

--Apple-Mail=_EFA7D6C2-C778-4C8E-AA13-C97DF1FA9036.+?(On \\d{0,2}[\\/\\-]\\d{0,2}[\\/\\-]\\d{0,4}.+?)--Apple-Mail=_EFA7D6C2-C778-4C8E-AA13-C97DF1FA9036

无需为此执行前瞻/后视。

于 2012-06-25T18:49:18.463 回答
0

这是两个将匹配文本的正则表达式。您可以gsub在每个表达式中找出适当的匹配组。

  1. /(^On \d\d\/\d\d\/\d{4}.*$\n(\n>.*$)*\n\n)/
  2. /(<span>On \d\d\/\d\d\/\d{4}.*<\/span>\n\n(<span>.*<\/span>\n)*)/

这应该是一个好的开始,但可以改进为更通用,但由于我们只知道一个示例,所以我刚刚写了这个来解决这个问题!

参考

于 2012-06-13T22:23:34.683 回答