正則貪婪模式vs非貪婪模式詳解

正則表達式貪婪與非貪婪模式

作為開始,我們看看下面的正則:

 var str = 'a "witch" and her "broom" is one';
 str.match( /".*"/g);

我們本來預想上面會匹配得到 witchbroom兩個字符串洼裤,運行上面的例子砾跃,卻發(fā)現(xiàn)結果只匹配到 "witch" and her "broom" 一個字符串猿棉。
之所以出現(xiàn)這個結局,是因為正則的貪婪模式在起作用残邀。查找算法首先我們假設自己是正則引擎皆辽,來模擬搜索實現(xiàn)的過程。 正則引擎先從字符串的第0位開始搜索芥挣。 1. 第一個查找字符是 " 驱闷,正則引擎在第三個位置匹配到了它:


之后,引擎嘗試匹配正則的剩余部分空免,第二個字符是 . ,它代表任意字符空另。隱藏匹配到了 w:

. 代表任意字符重復一次到多次,因此正則引擎匹配到所有字符

當文本結束后蹋砚,點的匹配停止了扼菠,但仍然有剩余的的正則需要匹配,即:"
因此坝咐,正則引擎開始倒過來回溯循榆,換句話說,就是一個字符一個字符縮減匹配墨坚。

當匹配縮減后秧饮,它開始嘗試匹配剩余的正則,但 " 沒有匹配上字符 e

因此正則繼續(xù)縮減 . 所重復的字符盗尸,再繼續(xù)嘗試柑船。


引號 " 沒用匹配上 n ,又失敗了~~泼各, 繼續(xù)…正則引擎繼續(xù)回溯椎组,一次一次縮減 . 重復的字符個數(shù),直到剩余的正則都匹配上:

現(xiàn)在 " 終于匹配上了历恐。 如果正則是global的寸癌,正則引擎會從上次匹配結果之后繼續(xù)查找更多結果。

再看一個例子:

 var str = 'a "witch" and her "broom" is one';
 str.match( /".*" a/g);  //輸出結果為:[""witch" a"]

在這個例子中弱贼,因為 * 的存在蒸苇,使得正則表達式具有貪婪屬性,操作模式同上吮旅,先匹配第一個 " 找到了witch前的 "溪烤,第二步匹配 . ,因為可以代表除了行結束符和換行符號的所有符號庇勃,因此直接跳到文本結尾 e檬嘀,接下來匹配 " ,找到 m 后面的 " ,接著匹配 " 后的空格,在匹配空格后的 a 责嚷,此時發(fā)現(xiàn)沒有鸳兽,則失敗,重新尋找 "罕拂;最終匹配到 "witch" a揍异。
總結:在貪婪(默認)模式下,正則引擎盡可能多的重復匹配字符
非貪婪模式
非貪婪模式和貪婪模式相反爆班,可通過在代表數(shù)量的標示符后放置 ? 來開啟非貪婪模式衷掷,如 ?+? 甚至是 ?? 柿菩。

 var str = 'a "witch" and her "broom" is one';
 str.match(/".*?"/g ) // "witch", "broom"

我們來看看非貪婪模式 .? 是怎么運轉的戚嗅。

  1. 第一步和上面類似,引號 " 被匹配上

    第二步一樣枢舶, . 被匹配上

下面是二者的重要區(qū)別懦胞。 正則引擎嘗試用最小可能的重復次數(shù)來進行匹配,因此在 . 匹配了 w 后祟辟,它立即嘗試 " 的匹配


可惜沒有匹配上医瘫,因為 t != ". 重復更多的字符旧困,再進行嘗試醇份。

又沒匹配上稼锅,繼續(xù)~~

下面終于匹配上了


因為正則是global的,所以正則引擎繼續(xù)后面的匹配僚纷,從引號后面的 a 字符開始矩距。后面有匹配到第二個字符串

總結:在非貪婪模式下,正則引擎盡可能少的重復匹配字符

本文引用若愚老師博客怖竭,僅用于學習使用锥债,特此聲明!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末痊臭,一起剝皮案震驚了整個濱河市哮肚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌广匙,老刑警劉巖允趟,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鸦致,居然都是意外死亡潮剪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門分唾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抗碰,“玉大人,你說我怎么就攤上這事绽乔』∮” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵迄汛,是天一觀的道長捍壤。 經(jīng)常有香客問我,道長鞍爱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任专酗,我火速辦了婚禮睹逃,結果婚禮上,老公的妹妹穿的比我還像新娘祷肯。我一直安慰自己沉填,他們只是感情好,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布佑笋。 她就那樣靜靜地躺著翼闹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蒋纬。 梳的紋絲不亂的頭發(fā)上猎荠,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天坚弱,我揣著相機與錄音,去河邊找鬼关摇。 笑死荒叶,一個胖子當著我的面吹牛,可吹牛的內容都是我干的输虱。 我是一名探鬼主播些楣,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宪睹!你這毒婦竟也來了愁茁?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤亭病,失蹤者是張志新(化名)和其女友劉穎鹅很,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體命贴,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡道宅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了胸蛛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片污茵。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖葬项,靈堂內的尸體忽然破棺而出泞当,到底是詐尸還是另有隱情,我是刑警寧澤民珍,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布襟士,位于F島的核電站,受9級特大地震影響嚷量,放射性物質發(fā)生泄漏陋桂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一蝶溶、第九天 我趴在偏房一處隱蔽的房頂上張望嗜历。 院中可真熱鬧,春花似錦抖所、人聲如沸梨州。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽暴匠。三九已至,卻和暖如春傻粘,著一層夾襖步出監(jiān)牢的瞬間每窖,已是汗流浹背帮掉。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留岛请,地道東北人旭寿。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像崇败,于是被迫代替她去往敵國和親盅称。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內容