用"/(.*?)d/"正則表達式匹配"abcd"為什麼得到的是"abcd"而不是"d"?
而用"/a(.*?)/"正則表達式匹配"abcd"則只得到"a"
以及另一個問題:用"/a(.*?)d/"正則表達式匹配"abcd"為什麼得到的是"abcd"而不是無法匹配?PHP代碼:
關於"?"元字元
/*知乎首問*/
非貪婪是滿足條件即返回結果。
* 是零或任意多個,所以 a(.*?) 實際上是相當於:
a * = 0
a. * = 1
a.. * = 2
a... * = 3
… …
以 a(.*?) 去匹配 abcdddef ,相當於
abcdddef
a * = 0
在 * 為 0 的時候就匹配到了 a ,所以就返回 a 。
如果以 a(.*?)d 去匹配 abcdddef ,其實就相當於:
abcdddef
|
ad | * = 0
a.d| * = 1
a..d * = 2
所以返回 abcd 。
對於「 "/(.*?)d/"正則表達式匹配"abcd"為什麼得到的是"abcd"而不是"d"?」這個問題還在嚷嚷非貪婪匹配的我只能嘆一聲你們這些戰五渣。
首先你們說的正則匹配一般是指partial match,或叫search。js里應該就是exec,但是我沒查過。這個策略是獨立於正則表達式本身的。一旦用了這個策略,正則引擎將尋找起點最靠左的可行解。因為無論你的正則表達式怎麼寫,第一個字元在元字元串的位置出現的越早,這個答案的優先順序就更高。
其實跟貪婪不貪婪沒什麼區別,原因只是因為正則是從前往後匹配而不是從後往前匹配
根本和貪婪非貪婪沒關係好么!!@Tim Shen 巨巨已經說了!!有個很重要的前提是正則表達式得成功啊,就是說要找到一個可行解!
/(.*?)d/
你把d去掉試一試
/(.*?)/
這樣是直接就返回了
因為要找到一個解啊!!!所以當發現d的時候,就會儘力去匹配。你們這群人啊。因為正則是從前往後逐字元掃描的
a yesb yesc yesd bingo
看到了一個非常棒的帖子,從NFA引擎機制上解釋了這一問題
引用過來供大家參考本題相關關鍵內容已加粗並下劃線(其中有兩張圖大家看完一定就明白了)對於貪婪與非貪婪模式,可以從應用和原理兩個角度進行理解,但如果想真正掌握,還是要從匹配原理來理解的。
先從應用的角度,回答一下「什麼是貪婪與非貪婪模式?」 2.1 從應用角度分析貪婪與非貪婪模式2.1.1 什麼是貪婪與非貪婪模式
先看一個例子 舉例: 源字元串:aa&test1&