1. 程式人生 > >精通正則表示式六:匹配優先與忽略優先

精通正則表示式六:匹配優先與忽略優先

定義

匹配優先:儘可能多的匹配
忽略優先:儘可能少的匹配
我們剛開始接觸的都是匹配優先:

* + ?{num,num}

忽略優先只需要在原本的匹配優先量詞後加一個問號即可:

*? +? ?? {num,num}?

要注意的是,DFA不支援忽略優先。

例項

來看下面兩個例子:
匹配優先:
這裡寫圖片描述
忽略優先:
這裡寫圖片描述
原因是什麼呢?上面說過,匹配優先總是儘可能多的匹配,所以‘\w+’先匹配所有的文字,然後為了匹配‘a’,‘\w+’需要交還一個字元,看是否能匹配‘a’,發現不能匹配,然後繼續交還字元,直到能匹配‘a’為止,如果所有的字元都交還完後還是不能匹配,報告匹配失敗。
而對於忽略優先,總是匹配儘可能少的字元,因為量詞‘+’最少匹配一個字元,所以‘\w+?’,先匹配‘1’,看後面的字元能否匹配‘a’,如果不能,‘\w+?’會繼續匹配‘2’,看後面的字元能否匹配‘a’,直到能匹配‘a’或嘗試所有可能後報告匹配失敗。

複雜點的例子

這裡寫圖片描述

這裡寫圖片描述
這兩個例子中捕獲括號裡捕獲的是哪個部分呢?是‘123’還是‘3’?
結果:
這裡寫圖片描述

這裡寫圖片描述
其實也不難理解,因為‘\w+’是匹配優先的,所以先會全部匹配,然後交還一個字元‘3’,這是‘\d+’正好能匹配,匹配成功。
而對於忽略優先,‘\w+?’會先匹配‘a’,這時‘\d+’無法匹配後面的部分,所以‘\w+?’會再多匹配一個字元,這是‘\d+’還是無法匹配後面的部分,然後‘\w+?’繼續多匹配一個字元,此時它匹配的是‘abc’,而‘\d+’則正好能匹配後面的‘123’,匹配成功。
關於匹配優先可能會遇到的問題及解決方法請看這裡這個例子