2015-10-05 28 views
6

我們剛在程序員使用(.)+時應用(.+)時發現了一些錯誤。一個簡單的修復,但我們無法解釋(.)+的行爲。任何人都可以解釋爲什麼這匹配「e」,最後一個字母,而不是「b」,正則表達式中的「a」之後的第一個字母?你會如何解釋(.)+(。)+在正則表達式中的行爲是什麼?

my $s = 'abcde'; 

if ($s =~ m{ a (.)+ }x){ 
    print "s '$s' matched '$1'\n"; 
}else{ 
    print "total match fail\n"; 
} 

__END__ 
output: 
s 'abcde' matched 'e' 
+1

我相信這背後的原因是因爲它保持匹配,直到它無法匹配模式。在哪一點,它是捕獲組中最後一個匹配的字符。 –

+1

嘗試在代碼的頂部添加'use re'debug';'。這對跟蹤正在發生的事情很有用。 – Sobrique

+4

我喜歡[重複捕捉組與重複組捕捉]中的解釋(http://www.regular-expressions.info/captureall.html)。 – ThisSuitIsBlackNot

回答

10

有,但只有在什麼條件捕獲和(.)+之間(.+)一個巨大的差異,不是匹配。

(.)+查找單個字符的一個或多個實例並捕獲其中的最後一個。

(.+)查找一個或多個單個字符並一次捕獲所有這些字符。

+0

我不知道如何記錄/安全'(。)+'是。我會使用'(。)。*'。 – ikegami

+3

@ikegami不應該是'。*(。)'? – AnFi

+0

@Andrzej A.菲利普,ack!是的,我的意思是'。*(。)' – ikegami