2

作为一名通过“Programming Perl”接触 Perl 的 PHP 程序员,我遇到了以下正则表达式:

/^(.*?): (.*)$/;

此正则表达式旨在解析电子邮件标头并将其插入哈希中。电子邮件标头包含在单独的 .txt 文件中,格式如下:

From: person@site.com
To: email@site.com
Date: Mon, 1st Jan 2000 09:00:00 -1000
Subject: Subject here

我用来处理这个示例正则表达式的整个代码如下:

use warnings;
use strict;

my %fields = ();

open(FILE, 'header.txt') or die('Could not open.');

while(<FILE>)
{
    /^(.*?): (.*)$/;
    $fields{$1} = $2;
}

foreach(%fields)
{
    print;
    print "\n";
}

现在,我的问题。我不确定为什么第一个子模式被修改为使用最小量词。挂断电话可能是一个小问题,但我不明白为什么会这样做。

感谢您的任何回复。

4

6 回答 6

7

如果没有,如果值包含:<space>.

想象:

Subject: Urgent: Need a regex

没有最小匹配$1会得到Subject: Urgent,而且$2会是Need a regex

于 2011-05-19T17:43:19.970 回答
6

考虑如果主题是 会发生什么Subject: RE: reply to something

最小量词将在 之后停止Subject,但贪婪量词将匹配到RE

于 2011-05-19T17:43:05.350 回答
4

因为否则它将匹配所有字符,直到最后一个':'。例如,没有最小量词这个字符串:

Test: My: Weird: String

将匹配“Test: My: Weird”作为第一组。但是使用最少的量词,它只会匹配“测试”。

于 2011-05-19T17:43:42.760 回答
4

它使用最小量词的原因是它不需要读取比冒号更远的内容。事实上,它不应该。我不确定这些关键字中可以存在哪些字符,但我很确定.有点太宽了,这就是问题所在。如果您的字段包含任何冒号,则非最小正则表达式会将其全部吞噬,例如:

Subject: Counter Strike: Source

如果第一个子模式是贪婪的,它会抓取Subject: Counter Strike,而不仅仅是Subject

于 2011-05-19T17:45:40.590 回答
0

如果没有最小量词,日期行的第一个捕获不是“日期:星期一,2000 年 1 月 1 日 09:00:”而不是“日期:”吗?

于 2011-05-19T17:43:45.350 回答
0

如果没有那个最小量词,从“日期:”行获得的 $1 的值实际上将是“日期:星期一,2000 年 1 月 1 日 09:00”,因为默认情况下 Perl 正则表达式是贪婪的。

于 2011-05-19T17:44:48.637 回答