2009-07-12 48 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」。