[小菜一碟] 要注意 Regular Expression 的 Greedy Mode(貪婪模式)

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 的了解上有一點幫助。

參考資料

C# 指南ASP.NET 教學ASP.NET MVC 指引
Azure SQL Database 教學SQL Server 教學Xamarin.Forms 教學