本文連接:http://www.hcoding.com/?p=130html
初學正則表達式的時候都有一個疑問,例如:須要匹配串 "_abc_123_" 中 第一對"_"之間的字符,剛開始學習正則表達式的時候會寫成 "/_\w*_/",匹配的結果就是"abc_123" 而不是"abc"了;大神說加上一個問號,"/_\w*?_/",這時候匹配的結果就是"abc"。正則表達式
咱們知道'?'單獨使用的時候表示:重複零次或一次,而當'?'出如今重複限定符後面的,起的做用就是懶惰匹配,也就是匹配儘量少的字符。懶惰限定符說明:學習
對的,「儘量少重複」,這就是對懶惰匹配的粗暴直白的解說。spa
那麼怎麼理解「儘量少重複」呢?咱們能夠從正則表達式的忽略優先量詞來解釋了。htm
量詞"*?"、"+?"、"??"、"{n,m}?"、"{n,}?"都屬於忽略優先量詞,忽略優先量詞使用的是在?、+、*、{}後面添加?組成的,忽略優先在匹配的時候首先會嘗試忽略,若是失敗後回溯纔會選擇嘗試。好比`ab??`匹配「abb」會獲得‘a’而不是「ab」。當引擎匹配成功a後,因爲是忽略優先,引擎首先選擇不匹配b,繼續查看錶達式,發現表達式結束了,那麼引擎就直接上報匹配成功。具體咱們經過下面的例子一步一步說明忽略優先量詞工做原理。get
仍是上面的例子,用"/_\w*?_/"匹配"_abc_123_" 中 第一對"_"之間的字符。it
開始匹配第一個'_'以後,‘\w*?’首先決定不須要匹配任何字符,由於它是忽略優先量詞,這時候就拿表達式'/_\w*?_/'中的第二個'_'('\w*?'後面的'_')和目標串'_abc_123_'中的'a'匹配,匹配失敗,這時候纔會拿'\w*?'去嘗試未匹配的分支(使用\w匹配a,嘗試匹配a成功)class
下一步,是嘗試匹配,仍是忽略呢?由於'\w*?'是忽略優先量詞,會選擇忽略,那麼就是重複上一步,'_'匹配b失敗,'\w*?'去嘗試未匹配的分支ab,以上步驟總共重複了3次後(直到表達式'\w*?'後面的'_'和目標串第二個'_'匹配),最終匹配出'abc'。原理
過程(開始匹配第一個'_'以後):coding
以上是閱讀《精通正則表達式》關於忽略優先量詞一節的想法,若有不對虛心接受各位的指教,謝謝!
本文連接:http://www.hcoding.com/?p=130
原創文章,轉載請註明:JC&hcoding.com