1. 程式人生 > >[perl]理解貪婪匹配和最小匹配之間的區別

[perl]理解貪婪匹配和最小匹配之間的區別

正則表示式的新手經常將貪婪匹配和最小匹配理解錯誤。預設情況下,Perl 的正則表示式是“貪婪地”,也就是說它們將盡可能多地匹配字元。

下面的指令碼打印出“matched defgabcdef”,因為它儘可能多地匹配模式,直至結尾的‘g’。

$data = 'abcdefgabcdefg';
$data =~ /abc(.+)g/i;
print "matched ";

要改變匹配特點,只須簡單地在量詞(加號[+]或星號[*])後面加一個問號(?)即可。在上面的程式中把模式改為在‘+’之後包含一個‘?’。

$data =~ /abc(.+?)g/i;

輸出變成“matched def”,因為模式不再貪婪,而在允許模式匹配的同時匹配最少數目的字元。

對於可能得到的匹配多於期望的匹配的情況,最小匹配是必要的。下面是一個例子:

$data = 'MSFT +5% IBM +2% 4';
print "matched "  while ($data =~ /(w+).+$(d+)/g);

你可能期望這段程式碼給出兩行輸出,一行是 MSFT,另外一行是 IBM。但是它的輸出卻只有(不正確的)一行,“MSFT 4”。‘+’模式匹配它能匹配的所有字元,也就是“+5% IBM +2%”。加一個‘?’將模式改為最小匹配就可以得到期望的結果。