1

我正在尝试使用正则表达式通过查看标题来匹配退回电子邮件的主题。我需要从此电子邮件标题中提取“会员激活”:

Received: from DOMAIN.mydomain.com (UnknownHost [127.0.0.1]) by DOMAIN.mydomain.net with SMTP;
   Fri, 6 Sep 2013 10:34:07 -0600
Date: Fri, 6 Sep 2013 10:34:07 -0600 (MDT)
From: "MyDomain.com" 
To: test@anotherdomain.com
Message-ID: <8279725.100.1378485247161.JavaMail.MYDOMAIN$@127.0.0.1>
Subject: Membership Activation
MIME-Version: 1.0
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 7bit

我试过了:

^Subject: (.+)$

但是 ^ 和 $ 不起作用,因为它们是 CRLF。然后我尝试了:

[\r\n]+Subject: ((.[^\r\n])+)

但是我没有在结果的第 2 组中获得“会员激活”的最后一个“n”。我不确定我对 CRLF 的否定是否正确。

有任何想法吗?

4

2 回答 2

1

尝试:[\r\n]+Subject: (([^\r\n])+)

我得到了最后一个'n'。

于 2013-09-08T16:37:27.767 回答
1

您的正则表达式很好,问题是行首^和行尾$锚默认仅在整个字符串的开头和结尾匹配。

这可以通过在正则表达式定义中使用特殊修饰符轻松解决,该修饰符在每行的开头和结尾而不是整个字符串或输入的开头和结尾进行匹配^$此修饰符取决于语言或工具,因此您必须查找您正在使用的工具或语言的文档以确定修饰符是什么。

例如在 PHP 中:

/^Subject: (.+)$/im
                  ^
     Notice the m modifier which makes ^ and $ match at the start and end of each line

在 Perl 中,与 PHP 相同:

/^Subject: (.+)$/im

在 Javascript 中,与 PHP 相同:

/^Subject: (.+)$/im

在 Python 中,将以下字符串传递给正则表达式构造函数或接受正则表达式字符串的方法:

r"(?m)^Subject: (.+)$"

在 Java 中,与 Python 相同:

"(?m)^Subject: (.+)$"

在 .NET 中,对于每个处理正则表达式的方法,都有一个重载,它接受一个RegexOptions打开多行模式的枚举:

RegexOptions.Mutliline

PHP 中的 Regex101 演示

编辑:显然您正在使用 ColdFusion,因此如果上述所有方法都不适用于您,请尝试以下表达式:

[\s\S]+Subject: (.+)

但它不如以前的选项有效。

正则表达式 101 演示

于 2013-09-08T16:45:16.330 回答