2009-07-12 42 views
3

我预计打印"[b]"但它打印"[]"为什么看起来像Perl正则表达式中的*不是贪婪?

$x = "abc"; 
$x =~ /(b*)/; 
print "[$1]"; 

如果恒星被替换为一个加号,它作为我期望的行为。不是两个都加上,明星应该是贪婪的?

新增:感谢大家指出(秒内,似乎!)认为,“B *”空字符串,第一次出现,其中是字符串甚至开始前一致。所以贪婪根本就不是问题。它甚至在到达第一个'b'之前匹配空字符串。

回答

10

这是贪婪的,但b*将空字符串相匹配。 什么 *会如果打印$'空串,所以,

"abc" 
    /\ 
    --- matches the empty string here. 

总是匹配你会看到它的ABC,这是比赛结束后的字符串的其余部分。贪婪仅仅意味着在“bbb”的情况下,你会得到“bbb”,而不是“b”或“bb”。

3

正则表达式匹配a(backtrack)(这是因为在正则表达式回溯一个空值)和结束。用+量词与ac不匹配,因此$1的值变为b

+1

不完全正确。它匹配并终止于`a`,而不是`c`。 – chaos 2009-07-12 21:30:16

+0

啊对,我把它当作全球比赛来考虑。纠正。 – Blixt 2009-07-12 21:31:26

10

该模式将匹配并返回第一次b*为真,即它将在a处执行零宽度匹配。为了更清楚地说明这是怎么回事,这样做:

$x = "zabc"; 
$x =~ /(.b*)/; 
print "[$1]"; 
3

正则表达式最早点字符串中匹配就可以了。在'abc'=〜/(b *)/的情况下,该点恰好在字符串的开头,它可以匹配零b。如果你曾试图匹配“BBC”,那么你就已经印:

[BB]

0

A *在模式的结尾几乎总是不是你想要的。我们甚至在学习Perl来解释这个问题。

1

尽早匹配具有比匹配的长度的更高的优先级(AFAIR这是Perl的正则表达式匹配引擎,这是一个NFA的情况下)。因此,在字符串开始处的零长度匹配比字符串中稍后的较长匹配更可取。

对于本article有关正则表达式匹配引擎的详细信息搜索“DFA VS NFA”。