2011-05-19 97 views
2

通过“编程Perl的工作一个PHP程序员新的Perl,我所遇到的以下的正则表达式:Perl的正则表达式的问题

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

此正则表达式的目的是分析电子邮件标头并将其插入到哈希。电子邮件头包含在一个单独的.txt文件,并在以下格式:

From: [email protected] 
To: [email protected] 
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"; 
} 

现在,在我的问题上。我不确定为什么第一个子模式被修改为使用最小量词。这可能是一个小问题,但我不明白为什么它已经完成。

感谢您的回复。

+1

请注意,作为一个侧面的问题,这里看到的邮件处理不处理邮件标题的延续线。以下是合法和共同的标题行:“主题:这是\ n \ tmultiline主题行\ n”。也请接受你最喜欢的答案。 – 2011-05-19 20:03:40

+1

请注意,最小量词可以用适用于适当受限字符类的普通(贪婪)量词替换。在这种情况下,请考虑/ ^([^:] *):(。*)$ /,其中第一组捕获尽可能多的非冒号字符。 – Narveson 2011-05-19 20:34:51

+1

只是一个侧面说明,尽管是一个经典的编程Perl,但它显示了它的年代,并且不包括当前关于风格方面的最佳实践的想法。看看Modern Perl,有效的Perl编程或者Perl最佳实践来获取这些信息。较新版本的Llama(Learning Perl)也具有这些风格差异。 PS,不要浪费时间学习伪哈希,他们已经从语言中删除了。 – daotoad 2011-05-20 05:00:55

回答

7

如果没有,则如果值包含:<space>,则存在无法正确匹配的风险。

试想:

Subject: Urgent: Need a regex 

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

+0

太好了。感谢大家的回复! – Pete171 2011-05-19 17:55:15

+0

不需要想象有问题的标题,OP的Date:标题中有另一个冒号。 :-) – tadmc 2011-05-19 23:42:24

+1

@tadmc:'Date:'头文件没有这个问题,它没有':'后面跟着一个空格。 – Mat 2011-05-20 04:45:21

6

请考虑如果主题为Subject: RE: reply to something会发生什么情况。

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

4

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

Test: My: Weird: String 

将作为第一组匹配“Test:My:Weird”。但最小的量词只会匹配“测试”。

0

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

+1

不是真的,因为原来的reg。恩。 ':'后面还包含空格。因此,在这种情况下,它将与具有和不具有最小量词的相同组相匹配。 – 2011-05-19 17:45:37

+0

啊,好点。无论如何,这里的其他答案都更好。 – 2011-05-19 17:47:01

0

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

+1

不是真的,因为原来的reg。恩。 ':'后面还包含空格。因此,在这种情况下,它将与具有和不具有最小量词的相同组相匹配。 – 2011-05-19 17:46:30

4

它使用最小量词的原因是它不需要阅读比冒号更远的地方。事实上,它不应该。我不确定哪些字符可以存在于这些关键字中,但我确信.有点过于宽泛,这就是问题所在。如果您的字段包含任何冒号,非最小的正则表达式将吞噬了这一切,例如:

Subject: Counter Strike: Source 

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

+0

不是真的,因为原来的reg。恩。 ':'后面还包含空格。因此,在这种情况下,它将与具有和不具有最小量词的相同组相匹配。 – 2011-05-19 17:46:44

+0

啊,好眼睛! :) – 2011-05-19 17:48:05

+0

是的,我看到你的评论前三次你发布它.. = P – TLP 2011-05-19 17:48:17