正規表示式的貪婪模式和非貪婪模式等若干問題

2021-08-26 10:49:01 字數 1707 閱讀 7505

1、貪婪模式:根據匹配字串以及表示式盡可能多的進行匹配,成為貪婪匹配模式

例如:/a\d+/ 即可以匹配首字母為a的之後的許多數字,這個不進行限制

或者另外一種方法/a\d/也可以實現同樣的方法

2、非貪婪模式:根據匹配字串以及表示式盡可能少的進行匹配。使用的方法就是在修飾匹配次數的特殊符號後再加上乙個?號進行限制 如"*?","+?","?","?"

如:/a\d+?/即匹配的字串為a為首字母,後面只能有乙個數字

3、複雜模式 分為分組,反向引用,候選,非捕獲性分組,前瞻,邊界定位符和多行模式等

1)、分組,引入()的概念,其語法是(pattern),即將「pattern」部分組合成乙個可以統一操作的組合項或子匹配,也就是說用括號括起一些字元,字元類或者量詞等,每個捕獲的字匹配項按照其出現的順序儲存在緩衝區中。 如:/(abc)/如過匹配的字串是wcabcabcabc的話則可以匹配到的字串是abcabcabc

2)、反向引用分組得到的子匹配,正規表示式後面的部分,可以引用前面分組的子匹配中已經匹配到的字串,這稱之為反向引用 語法是\num,即可以引用編號為num的內容 其值是1-99的整數 如:/(\w)\2/ 其中\2表示子匹配 如果/\w/可以匹配目標字串中連續出現的幾個字元,則可以是用/\w\1/來匹配。正規表示式/<(\w+)\s*(\w+(=('|").*?\4)?\s*)*>.*?/就可以匹配 這裡的\1就是匹配的第乙個括弧中\w+的內容。

3)、候選:即用「|」來表示匹配的表示式之間的或關係,語法是表示式|表示式,兩個表示式是或的關係。如匹配座機號碼 有3位區號8位號碼和4位區號7位號碼這兩類,在寫正規表示式的時候就可以寫/(((\d\)|\d-)\d)|(((\d\)|\d-)\d)$/即表達了兩類方式如023-47854***或者023/47854*** 或者0234/******x 0234-******x

4)、非捕獲性分組:其語法是(?:pattern),將pattern部分組合成為乙個可以統一進行操作的組合項,但是不把這部分內容當做子匹配捕獲,這種方法必須在進行組合,但是又不想對組合的部分進行快取的情況下使用。如找倆單詞:programe和project 前面的pro都相同,則可以寫成/programe|project/或者是/pro(gram|ject)/,如果進行非捕獲性匹配的話就要寫成/pro(?:gram|ject)/

5)、正向前瞻:語法是(?=pattern) 在目標字串的響應位置必須要有pattern部分匹配的內容,但是不作為匹配結果處理,不會放在緩衝區中。/windows(?=xp|7)/,只能匹配windows xp和windows7,不能匹配其他的內容 xp和7不作為結果返回。

6)、負向前瞻:語法是(?!pattern) 在被搜尋的字串的相應位置不能有pattern部分表示的內容,不能將其作為結果進行處理,也不會存在緩衝區中。 如/bed(?!room)/可以匹配bed後不是room的所有字串

7)、邊界定位符:^ 與字串開始的地方匹配,不匹配任何字元 但是如果是放在[^a-z]的時候就表示匹配除了a-z以外的字串。$表示與字串結束的地方匹配,也是不匹配任何的字元。\b 匹配乙個單詞的邊界,也就是單詞和空格之間的位置,不匹配任何字元 \b是\b的「非」,即是匹配乙個非單詞邊界。

來自:

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

限定符都是貪婪的,因為它們會盡可能多的匹配文字,只有在它們的後面加上乙個?就可以實現非貪婪或最小匹配。文字 貪婪 下面的表示式匹配從開始小於符號 之間的所有內容。非貪婪 如果您只需要匹配開始和結束 h1 標籤,下面的非貪婪表示式只匹配 如果只想匹配開始的 h1 標籤,表示式則是 可以在grep中使用...

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

貪婪與非貪婪模式影響的是被量詞修飾的子表示式的匹配行為,貪婪模式在整個表示式匹配成功的前提下,盡可能多的匹配,而非貪婪模式在整個表示式匹配成功的前提下,盡可能少的匹配。非貪婪模式只被部分nfa引擎所支援。1.舉乙個例子 string str abcaxc patter p ab.c 貪婪匹配 正規表...

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

在正規表示式中,存在兩種匹配模式。貪婪模式 正規表示式,在符合條件前提下,會盡可能多的匹配結果 懶惰模式 在正規表示式,如果符合條件的前提下,會盡可能少的匹配。在python中正規表示式預設是貪婪模式 個別語言也可能是非貪婪模式 貪婪模式就是總會嘗試匹配到更多的字元。非貪婪模式則反之,總是嘗試匹配盡...