
158
|
第四章
解決方案
在預設情況下,
a__
與
a___
等序列模式以
Shortest
方式進行匹配,這意味著模式會尋
找最短的匹配序列。以下的重複取代模式應該要將雜亂串列轉換為相同元素相鄰的串
列,它幾乎達到了,但其中有一個 3 及 1 不太聽話地留在原處,這是因為在最後一次匹
配時,
a___
匹配空序列(最短的情況),
b_
匹配 1,
c__
也匹配 1,
b_
匹配第 3 個 1,而
d___
匹配剩餘元素,這次轉換並沒有改變轉換前串列,因此
ReplaceRepeated
終止了。
相對地,我們於相同轉換使用
Longest
,強迫
a___
模式貪婪地搜尋最長序列,而其他模
式保持不變。[Page-160]
強迫
a___
匹配最長序列,但剩餘序列仍需滿足其他模式,這能夠找出所有被一個以上
的其他元素隔開的相同元素序列。
討論說明
熟悉正規表示式的讀者應該認得出來,以上提供的解法便是貪婪匹配及非貪婪匹配的差
異,這個差異經常使模式的設計者感到挫敗,因為通常非貪婪的模式會在意想不到的時
間出現。為避免這個情況發生,有個原則你必須謹記在心,
a__
模式可能僅匹配一個元
素,而
a___
模式可能匹配空序列;這個結果可能就是你要的,但也有可能完全不是。
你可能會問,既然預設原則是匹配最短序列,為什麼還需要
Shortest
設定模式,這是因
為對字串模式而言(請見第 5 章),匹配的預設原則是完全相反的,在需要的時候可使
用
Shortest
模式匹配最短字串,但最好限制於模式的最前端部分使用。
還有一點需謹記住,如果使用了數個
Shortest
或
Lo