2012-06-14 89 views
4

在我熟悉的所有語言的正則表達式引擎中,.*表示法表示匹配零個或多個字符。請看下面的Javascript代碼:正則表達式模式匹配順序

var s = "baaabcccb"; 
var pattern = new RegExp("b.*b"); 
var match = pattern.exec(s); 
if (match) alert(match); 

此輸出baaabcccb

同樣的事情發生在Python:

>>> import re 
>>> s = "baaabcccb" 
>>> m = re.search("b.*b", s) 
>>> m.group(0) 
'baaabcccb' 

的原因是什麼,這兩種語言的匹配"baaabcccb"而不是簡單地"baaab"?我讀模式的方法是「找到一個以b開頭的子字符串,然後有任意數量的其他字符,然後以b結尾。」 baaabbaaabcccb都滿足這個要求,但Javascript和Python都符合後者。我預料它匹配baaab,只是因爲該子字符串滿足要求首先出現。

那麼爲什麼在這種情況下模式匹配baaabcccb?並且,是否有任何方法可以修改此行爲(使用任一種語言),以便它與baaab相匹配?

回答

6

你可以通過在*之後加上?這樣來使得正則表達式不是貪婪:b.*?b。然後它會匹配最小的字符串posible。默認情況下,正則表達式很貪婪,並會嘗試找到儘可能長的匹配。

+0

可能會增加,它的貪婪在默認情況下,這意味着正則表達式將嘗試匹配最長的字符串可能 – David

+0

@大衛好呼叫 – Trevor

2

.*是一個貪婪的匹配。 .*?是非貪婪版本

2

因爲*和+也基本上是貪婪的(至少在python中,我不確定關於js)。他們會盡可能地匹配。如果你想避免這個問題,你可以添加?在他們之後。

這裏是關於這個偉大的教程,在貪婪與非貪婪部分: google python class