正規表示式 貪婪與非貪婪(惰性)

2021-09-20 06:51:52 字數 2187 閱讀 8671

有時,我們想用正則匹配以某個子串開頭,且以某個子串或字元結尾的子字串,但是結尾的字串或字元在原字串**現了多次,但我們只想匹配從開始處到第一次出現的地方,換句話說,想得到開始和結尾之間內容最少的匹配

通常使用如下字元類描述前導字元的重複特徵:

1. ?: 告訴引擎匹配前導字元0次或一次。事實上是表示前導字元是可選的。

2. +: 告訴引擎匹配前導字元1次或多次。

3. *: 告訴引擎匹配前導字元0次或多次。

4. : 告訴引擎匹配前導字元min次到max次。min和max都是非負整數。如果有逗號而max被省略了,則表示max沒有限制;如果逗號和max都被省略了,則表示重複min次。

因此 和 * 一樣, 和 + 的作用一樣。

預設情況下,? + * 都是貪婪的,也就是說,它會根據前導字元去匹配盡可能多的內容。

非貪婪就是匹配盡可能少的內容。

結合例項來分析哈基於正則的引擎對文字的匹配過程。原始字串:this is a first test,使用正則<.+>來匹配html標籤,期望第一次匹配得到,第二次匹配得到,實際卻是第一次匹配就得到了first

來看看匹配過程,第乙個記號是<,這是乙個文字字元,匹配其自身。第二個符號是.,匹配了字元e,然後+一直可以匹配其餘的字元,直到一行的結束。然後到了換行符,匹配失敗(.不匹配換行符)。於是引擎開始對下乙個正規表示式符號進行匹配,即試圖匹配>。到目前為止,<.+已經匹配了first test。引擎會試圖將>與換行符進行匹配,結果失敗了。於是引擎進行回溯。回溯後的匹配狀況是<.+匹配first tes。於是引擎將>t進行匹配。顯然還是會失敗。這個過程繼續,直到<.+匹配first>匹配。於是引擎找到了乙個匹配first。記住,正則導向的引擎是急切的,所以它會急著報告它找到的第乙個匹配。而不是繼續回溯,即使可能會有更好的匹配,例如。所以我們可以看到,由於+的貪婪性,使得正規表示式引擎返回了乙個最左邊的最長的匹配。

如果想得到期望的結果,就需要啟用非貪婪模式:<.+?>

總結:如果是貪婪匹配模式,正則引擎會一直匹配到字串最後;當匹配為false時,就回溯以找到倒數第乙個匹配位置,返回匹配結果。 如果是非貪婪匹配模式,正則引擎會匹配到符合pattern的末尾位置那個字元,然後再往後走一步,發現匹配為false時,就回溯以找到最近乙個匹配為true的位置,返回匹配結果。

例如,原始字串:

,"dbgrant":,"dbschemaid":"0000031737"}
現在想把這部分敏感資訊替換為空字串:

"accesskey":,
先不考慮結尾的逗號,嘗試正則:"accesskey":\,直接匹配至原始字串結尾的}字元,因為引擎缺省會匹配盡可能多的內容。

考慮到貪婪性,將正則修改為:"accesskey":\+?,匹配結果一樣。納尼?難道我對貪婪性的理解有問題。梳理哈使用姿勢,我期望它匹配到開始位置之後出現的第乙個}字元,對應的表示式部分為\}+?。套用非貪婪模式分析問題,期望對乙個或多個}字元進行匹配,且匹配盡可能少的內容,但在原始串中,}字元都是分開的,沒有連續,無論如何只能匹配乙個單獨的}字元。可見對}字元開啟非貪婪模式匹配行不通。

想要匹配到開始位置之後出現的第乙個}字元也可以表達為開始位置和末尾}字元之間的內容最少,對應正則部分修改為:.+?,完整表示式:"accesskey":\,測試匹配結果,妥妥的。

正確理解正則回溯

深入淺出之正則(一)

正則高階(二)- 回溯引用、前後查詢、嵌入條件

正則學習筆記(6)向前查詢和向後查詢

正則 - 向前匹配、向後匹配、負向前匹配、負向後匹配

正規表示式 貪婪與非貪婪

在一段時間內,一直不知道.和.之間的區別,一直單純的覺得兩者之間並沒有什麼區別,都是匹配任意字元,知道今天才知道其中的區別 首先從乙個簡單的問題的問題開始思考 有這樣乙個字串aaabaaab,和這樣的乙個正則.b,那麼.匹配的會是aaab還是aaabaaab呢?由此問題引發出來的就是貪婪與非貪婪模式...

正規表示式 貪婪與非貪婪匹配

貪婪匹配與非貪婪匹配 貪婪匹配 預設情況下,正規表示式使用最長匹配原則 也叫貪婪匹配原則 例如 要將 zoom 中匹配 zo?的部 分替換成 r 替換的的結果是 rom 如果要將 zoom 中匹配 zo 的部分替換成 r 替換後的結果是 rm 非貪婪匹配 當字元?緊隨其他限定符 之後時,匹配模式變成...

正規表示式貪婪與非貪婪模式

之前做程式的時候看到過正規表示式的貪婪與非貪婪模式,今天用的時候就想不起來了,現在這裡總結一下,以備自己以後用到注意。1.什麼是正規表示式的貪婪與非貪婪匹配 如 string str abcaxc patter p ab c 貪婪匹配 正規表示式一般趨向於最大長度匹配,也就是所謂的貪婪匹配。如上面使...