用于匹配ruby中的行之间的内容的正则表达式

时间:2012-06-13 21:46:27

标签: ruby regex email-integration

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

From: XXXX
... mail headers ...
Content-Type: multipart/alternative;
  boundary="Apple-Mail=_EFA7D6C2-C778-4C8E-AA13-C97DF1FA9036"
... more mail headers ...

--Apple-Mail=_EFA7D6C2-C778-4C8E-AA13-C97DF1FA9036
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
  charset=us-ascii

New comment added from Mac Mail

On 12/06/2012, at 12:51, XXXX@example.com wrote:

> Thread
> text
> to be
> removed
>=20

--Apple-Mail=_EFA7D6C2-C778-4C8E-AA13-C97DF1FA9036
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
  charset=us-ascii

<html>... lots of HTML...

<span>On 12/06/2012, at 12:51, XXXX@example.com wrote:</span>

<span> Thread </span>
<span> text </span>
<span> to be </span>
<span> removed </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)

但这不是从边界捕获直到第一个“开启”

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分: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)*)/
  3. 这应该是一个良好的开端,但可以改进为更通用,但由于我们只知道一个例子,我刚刚写了这个就可以了!

    <强>参考