Javascript正則表達式可以說是Js中最重要的內容之一。它能解決很多字符串匹配的問題。比如想判斷一個字符串是否為合法的郵箱地址,是否為有效的手機號等。然而,在匹配字符串時,一旦遇到貪婪和惰性這兩種匹配模式,它們的饑餓程度就展現無遺了。下面,我們就來看看這兩種匹配模式的區別。
貪婪模式(Greedy Quantifier)是指在匹配字符串時,會盡可能地去匹配滿足條件的最長字符串,而不是找到就返回。比如,如下代碼:
let str = "aaaab"; let result = str.match(/a+/g); console.log(result);它的輸出結果為:['aaaa']。這是因為貪婪模式會盡可能地匹配到最長的符合匹配規則的字符串,所以結果就是它所匹配到的最長字符串。
相對地,惰性模式(Lazy Quantifier),又稱為非貪婪模式,是指在匹配字符串時,會盡可能地去匹配滿足條件的最短字符串,而不是找到就返回。比如,如下代碼:
let str = "aaaab"; let result = str.match(/a+?/g); console.log(result);它的輸出結果為:['a', 'a', 'a', 'a'],這是因為惰性模式會盡可能地匹配到最短的符合匹配規則的字符串,所以結果就是它所匹配到的最短字符串。
貪婪模式在匹配時會盡量匹配到符合模式的最長字符串,如果不是它需要的話,就不會回溯。而惰性模式則嘗試利用回溯,使匹配的長度最短。下面再來看一個正則表達式中,貪婪模式與惰性模式的差異。
let str = "123"; let result1 = str.match(/456789.*<\/div>/g); let result2 = str.match(/.*?<\/div>/g); console.log(result1); console.log(result2);輸出結果為:['123'] 和 ['456789123', '456']。由此可見,貪婪模式的輸出結果是整個匹配的字符串,而惰性模式將匹配結果切成了三個部分,輸出了每個匹配結果的最短字符串。在實際開發中,我們可以根據具體需求來選擇使用貪婪模式還是惰性模式。如果想要匹配最長的字符串,就使用貪婪模式;如果想要匹配最短的字符串,就使用惰性模式。當然,也可以使用正則表達式元字符“?”來定義非貪婪模式。
let str = "aaaab"; let result = str.match(/a+??/g); console.log(result);它的輸出結果同惰性模式:['a', 'a', 'a', 'a']。綜上所述,貪婪模式和惰性模式是在匹配字符串時經常會遇到的問題。需要我們根據實際情況來選擇使用哪一種模式。同時,以正則表達式元字符“?”來表示非貪婪匹配,也是我們必須掌握的知識點。