正規表示式貪婪模式與非貪婪模式
什麼是正規表示式的貪婪模式和非貪婪模式?
我們先從例子入手:
var str = 'a "witch" and her "boom" is one';
str.match(/".*"/g);
原本想要匹配的字元為"witch"
和"broom"
兩個字串,執行以上的例子看看執行結果:
發現匹配的是
"witch" and her "broom"
這個字串,之所以出現這個結果,是因為正規表示式的貪婪模式在起作用。
查詢演算法
我們假設自己是正則引擎,模擬一下搜尋實現的過程。
正則引擎先從字串的第0位開始搜尋。
- 第一個查詢字元是
"
,正則在第三位匹配到了它: - 引擎嘗試匹配正則的剩餘部分,第二個字元是
.
,它代表任意字元。隱藏匹配到了w
: -
.
代表任意字元重複一次到多次,因此正則引擎匹配到所有字元: - 當文字結束後,點的匹配停止了,但任然有剩餘的正則需要匹配,即:
"
,因此,正則引擎開始倒過來回溯,換句話說,就是一個字元一個字元縮減匹配。
當匹配縮減後,它開始嘗試匹配剩餘的正則,但"
沒有匹配上字元e
。 - 因此正則繼續縮減
.
所重複的字元,再繼續嘗試:
引號"
沒有匹配上n
,又失敗了,繼續嘗試匹配。。。 - 正則引擎繼續回溯,一次一次縮減
.
重複的字元個數,直到剩餘的正則都匹配上:
現在"
終於匹配上了。如果正則是global
的,正則引擎會從上次匹配結果之後繼續查詢更多結果。
由上面的例子可以看出,在貪婪(預設)模式下,正則引擎儘可能多的重複匹配字元
非貪婪模式
非貪婪模式和貪婪模式相反,可通過在代表數量的標示符後放置?
來開啟非貪婪模式,如?
、+?
甚至是??
。
可以看到,這次匹配到了
"witch"
和"broom"
。接下來看看非貪婪模式
.?
是怎樣運轉的
- 第一步和上面類似,引號
"
被匹配上: - 第二步,
.
被匹配上: - 下面是兩者的重要區別。正則引擎嘗試用最小可能的重複次數來進行匹配,因此在
.
匹配了w
後,它立即嘗試"
的匹配:
沒有匹配上,因為i!="
。 -
.
重複更多的字元,在進行嘗試:
又匹配上,繼續。。。 -
終於匹配上了:
- 因為正則是
global
的,所以正則引擎繼續後面的匹配,從引號後面的a
字元開始。後面又匹配到第二個字串:
常見量次符:
? 問號表示某個模式出現0次或1次,等同於{0,1}。
* 星號表示某個模式出現0次或多次,等同於{0,}。
+ 加號表示某個模式出現1次或多次,等同於{1,}。
總結:通過上面的兩個例子,我們發現一些量詞符在預設情況下都是最大可能的匹配,即匹配直到下一個字元不滿足匹配規則為止,這就是貪婪模式。要想匹配到非貪婪模式可以在量詞後面加一個問號。
參考資料:
相關文章
- 正規表示式:貪婪模式與非貪婪模式模式
- 【正規表示式系列】貪婪與非貪婪模式模式
- 正規表示式 貪婪模式模式
- Java 正規表示式匹配模式(貪婪型、勉強型、佔有型)Java模式
- 11.一個正規表示式案例讓你馬上明白貪婪匹配與禁止貪婪! 超級實用!
- JAVA 正規表示式的三種模式: 貪婪, 勉強和佔有的討論Java模式
- 貪婪演算法回顧演算法
- 貪心演算法(貪婪演算法,greedy algorithm)演算法Go
- Python 正則是否存在前向貪婪匹配呢?Python
- Epic 大戰谷歌蘋果,未必只因貪婪谷歌蘋果
- Python 中的貪婪排名演算法Python演算法
- 模式匹配與正規表示式模式
- 演算法(六):圖解貪婪演算法演算法圖解
- Python RE庫的貪婪匹配和最小匹配Python
- 《貪婪之秋》銷量破百萬 官方將推出次時代版本
- FreeSql 新功能介紹:貪婪載入五種方法SQL
- 尋路演算法-貪婪最佳優先演算法演算法
- “裝箱”問題的貪婪法解決演算法演算法
- 索尼CEO斯丁格炮轟蘋果賈伯斯太貪婪蘋果
- “馬的遍歷”問題的貪婪法解決演算法演算法
- 不怕微軟貪婪 XP登錄檔與驅動程式最佳化全集(轉)微軟
- 正規表示式支配匹配模式模式
- 正規表示式模式修飾符模式
- 常用正規表示式匹配模式(java)模式Java
- 騰訊入股《貪婪洞窟》開發商阿哇龍科技,佔股12.7%
- 即時通訊產品的一點小思考,貪婪的代價
- “人民幣找零”問題的貪婪法解決演算法演算法
- 【USACO題庫】 Greedy Gift Givers貪婪的禮物送禮者c++C++
- 貪心模式記錄模式
- PHP中的正規表示式及模式匹配PHP模式
- 暴雪收購Spellbreak開發商Proletariat以滿足魔獸粉絲“貪婪的胃口”
- 《貪婪之秋》:一個小團隊針對經典美式RPG的文藝復興
- PHP正規表示式模式修飾符詳解PHP模式
- 深入分析正規表示式的子模式模式
- PostgreSQL中的模式匹配和正規表示式 - DasSQL模式
- 映象世界:玩家、藝術家和貪婪的投資者,都被畫素掛在區塊鏈上區塊鏈
- 京東數千萬使用者資料疑似外洩 人性貪婪催生的“資料黑產”
- JavaScript權威指南(10)——正規表示式的模式匹配JavaScript模式