Regular Expression(正則表達式),在我個人的學習過程一直都是用戰養戰的方式來熟悉它的,透過不斷地實作來讓自己對這些生澀的語法不再陌生,但是其中有一些特性即使知道了還是會踩坑,Greedy Mode(貪婪模式)
就是其中一個。
Greedy Mode(貪婪模式)
貪婪模式是 Regular Expression 數量詞
所擁有的特性,而數量詞指是用來表達比對次數的詞語,像是 *
、+
、?
、{n}
、{n,m}
這些都是數量詞,貪婪模式是說這些數量詞會「盡可能多
」比對出匹配的結果,舉一個典型的例子,我們常常會需要找出夾在一對符號之間的文字,比如我輸入像下面這樣的資料,然後要將字串符號之間的數字分離出來。
"123""456""789"
一般我們沒想太多就會直接像下面這樣寫,結果會是「123""456""789」錯的:
var matches = Regex.Matches("\"123\"\"456\"\"789\"", "\"(.*)\"");
.
表示任意字元,所以 "
也是匹配的對象,在貪婪模式的作用下,它會盡可能地將匹配到的對象放在結果裡面。
Lazy Mode(懶惰模式)
我們想要的結果是匹配出 123、456、789 這三組數字,因為貪婪模式的關係,匹配的結果是非預期的,倒也不是說貪婪模式有錯,而是我們不了解這個特性而已,現在這個範例的問題我們應該改用 Lazy Mode(懶惰模式)
來解,只要在數量詞的後面加個 ?
符號,它就變成了懶惰模式,做「盡可能少
」的匹配。
var matches = Regex.Matches("\"123\"\"456\"\"789\"", "\"(.*?)\"");
以上,Regular Expression 的 Greedy Mode(貪婪模式)就分享給大家,希望對大家在 Regular Expression 的了解上有一點幫助。