所謂貪婪模式和非貪婪模式,都是在正則表達式進行匹配時的一種狀態。
var str = 'hello world "tomorrow" will be "better" '
str.match(/".*"/g);
按照一貫的邏輯思維,匹配得到的結果應該會是tomorrow
和better
。但是我們運行一下會發現,匹配的結果是"tomorrow" will be "better"
。
這個時候就是正則的貪婪模式在起作用。
所謂的貪婪模式就是在可以匹配多個結果時選取最大值的結果個數。
當匹配個數時,出現“+、*、{n,m}、{n,}”這些量詞的時候,默認為最大數值的匹配個數。
上面的例子中,我們想讓匹配的結果和我們預想的一樣該如何操作呢?
取消貪婪模式時,只需要在量詞后面加上“?”即可。
var str = 'hello world "tomorrow" will be "better" '
str.match(/".*?"/g);
這個時候我們就關閉了貪婪模式,正則引擎在匹配時會盡可能少的來匹配字符。上面代碼的輸出結果即為"tomorrow"
和"better"
。
總結一下:在數量匹配時,正則引擎默認的規則為“貪婪模式”。在貪婪模式下,正則引擎會盡可能多的匹配字符,一直到匹配的結果為false
時,回溯去尋找倒數第一個匹配位置,返回結果。“非貪婪模式”下,正則引擎會盡可能少的匹配字符,將第一個匹配結果為true
的結果返回。取消貪婪模式的方法實在量詞后面加上“?”即可。