Perl正则表达式匹配过于宽泛

时间:2015-05-30 14:32:07

标签: regex perl

我有一个从Linux邮件日志中获取的字符串,如下所示:

May 20 12:19:28 example-03 amavis[1445]: (01445-15) Passed SPAMMY {RelayedTaggedInbound}, [10.4.3.2]:49488 [10.4.3.2] <offers-john=example.com@example.net> -> <john@example.com>, Queue-ID: C00OZs0w9DB, Message-ID: <5ZCfDBMQyiUjOVD78ZFxg5%3D%3D@example.net>, mail_id: aCUpU0wtUaR, Hits: 15.587, size: 21407, queued_as: dgzikuucQ9i, 438 ms

我需要提取的元素是:

<offers-john=example.com@example.net> -> <john@example.com>

我想让我的正则表达式尽可能简单明了,所以我不想进入正则表达式来处理电子邮件地址格式。尤其是因为重新编写电子邮件格式是一个容易出错的过程!

我试过了:

$row =~ /(<.*> -> <.*>,)/;

但是,尽管存在逗号分隔符,但该语法一直匹配到Message-ID结尾的末尾,输出如下:

<offers-john=example.com@example.net> -> <john@example.com>, Queue-ID: C00OZs0w9DB, Message-ID: <5ZCfDBMQyiUjOVD78ZFxg5%3D%3D@example.net>,

3 个答案:

答案 0 :(得分:3)

您需要将?添加到正则表达式中,以使其变得非贪婪:

(<.*?> -> <.*?>)

Demo

答案 1 :(得分:2)

默认情况下,量词*是贪婪的。它尽可能地匹配,你需要通过在它之后添加?来使它变得懒惰(a.k.a。非贪婪)。这是一个example

答案 2 :(得分:1)

在没有非贪婪选项的情况下写得更加健壮,如果在/x修饰符的帮助下添加无关紧要的空格,则更清晰。像这样

$row =~ / ( <[^<>]*> \s* -> \s* <[^<>]*> ) /x;