學懂正則2 量詞匹配模式 的貪婪 非貪婪和獨佔

2021-10-08 19:56:00 字數 2309 閱讀 8292

獨佔模式

其它總覽

貪婪模式與非貪婪模式

貪婪模式

使用a*來匹配 aaabb會得到如下結果:

總共有四次匹配符合,分別是:'aaa', '', '', ''後三次都是空字串,這也是*這一量詞的特點,它會匹配空字串,而正則認為字串以空字元結尾。

如果 a* 去匹配 『aaa』,得到結果也會是兩個,分別是'aaa', 『』

非貪婪模式

在量詞後面加上?就是非貪婪匹配了,使用a*?來匹配 aaabb 會得到如下結果:

分別有9個匹配,分別是:'','a','','a','','a','','','',每個最小匹配的a前面還有乙個空字串,前面末尾還要再匹配一次空字串已經讓人覺得費解了,現在跑出來說,每個a前面還要匹配乙個空字串,翻譯翻譯,什麼叫 * 量詞加上非貪婪模式

對於使用a*?來匹配字元'a',會有三種結果,分別是:'','a','',正則匹配進行的過程是這樣的:

可以看到,在0-0和1-1這兩個端點位置進行了匹配,而每乙個端點,正則都認為它是空字串,1個字元那麼就有兩個斷點,a的左側是0,a的右側是1,[0,1]區間代表了字元a,0,1這兩個端點是空字元,再來看一下對aaabb的匹配結果就能夠理解了:

0-5的六個端點全部做了一次空字元的匹配,所以一定要注意單字元使用*?時候的坑點。

回溯回溯是正則在匹配時的乙個重要概念,這裡的通過乙個例子簡單的理解一下

待匹配字串:xyyyz

使用貪婪匹配:xyyz

非貪婪匹配:xy?yz

都可以匹配成功,但二者的匹配過程是不一樣的:

對於貪婪模式,它會先匹配3個y,然後遇到字串字元是z,但是希望匹配的是y,它就會吐出乙個已經匹配的y來嘗試進行匹配,如果成功則繼續進行,如果失敗則繼續吐出,直到成功或者無法滿足返回失敗。

對於非貪婪模式,它會只匹配乙個y,之後遇到的字串字元是y,想要匹配的也是y,繼續匹配,再往前,遇到的字串字元是y,但是想要匹配的z,不滿足,則回到非貪婪匹配那裡,嘗試多匹配乙個y,多匹配是能夠滿足要求的,則多匹配乙個,然後繼續前進,遇到的字串字元是y,想要匹配的也是y,之後是z…

在這裡我們可以知道回溯貪婪和非貪婪模式下是必須的,正則在具體實施過程中會對這個過程有優化,具體這裡就不闡釋了。

但是這裡也還是可以再講一點的,考慮待匹配字串xyyz,正則為xyz, 那麼當原字串指標到z的時候我吃進去,發現不是y,我再吐出來,這個過程是回溯嗎?

其實是這個過程並不正確,要明確的是,z並不會被吃進去,在編譯原理中的語義分析階段就是大量的正則的過程,在這個環節匹配是模擬兩個棧,乙個是原字串,乙個是待匹配的正則式子,二者的棧頂是:原字串是z,正則是y(大概意思就是可以不匹配,最多再匹配兩個),此時將正則棧pop了,而不是將z吃進去了

獨佔模式

回溯是耗費效能的,如果以匹配了乙個很長的字串,最後發現失敗,那麼要回溯,如果還要多次回溯,那麼可想而知是占用資源的。

獨佔模式就一種不回溯的貪婪匹配,在量詞後面新增+就是獨佔模式,但是不同語言對獨佔模式的支援不同,有的語言並不支援獨佔模式。

考慮原字串:xyyz

正規表示式:xy+yz

結果就會是: no match

為什麼呢,獨佔模式的匹配過程是這樣的:

按照最長匹配匹配兩個y,原字串到z,正則是y,不符合,直接fail,它不會進行任何的回溯。

其它關於正則回溯造成的效能問題感興趣的可以閱讀:

乙個正規表示式引發的血案,讓線上cpu100%異常!

正則非貪婪匹配

string str 註冊商 xiamen ename network technology corporation limited dba ename corp,網域名稱伺服器 whois.ename.com,相關 dns 伺服器 ns1.ename.net,dns 伺服器 ns2.ename.n...

re 正則匹配的非貪婪匹配

非貪婪匹配 將盡可能少的匹配內容,當?出現在其他的重複次數後面時會將貪婪模式改為非貪婪模式。如 abc.abc.非貪婪匹配 盡可能少的匹配?號表示 號前面的字元出現0 無數個 號表示最少匹配 號表示 號前面的字元出現1 無數個 表示0 1個 print re.findall r ab aababba...

python非貪婪匹配 python正則非貪婪模式

那如果只想匹配1次怎麼辦呢,這就是正則中非貪婪模式的概念了 原理就是利用?與其他匹配次數規則進行組合 單個匹配規則 表示匹配0 n次 表示匹配1 n次 表示匹配0 1次 三者可組合成非貪婪模式匹配次數解析 簡而言之 它們必須結合左右的子串進行匹配,左邊正則必須非空,右邊正則可以為空,中心思想就是在匹...