1. 程式人生 > 其它 >【筆記】正則表示式·記②

【筆記】正則表示式·記②

正則表示式·記②

貪婪匹配、非貪婪匹配和獨佔模式

貪婪匹配

在正則中,表示次數的量詞預設是貪婪的,在貪婪模式下,會嘗試儘可能最大長度去匹配,如果後面的匹配不上,會吐出已經匹配過的再去嘗試

aabb 中使用正則 a* 的匹配過程:

第一次到第一個字母b發現了不滿足的情況,輸出aa

第二次匹配剩下的bb,發現配對不上,輸出空字串

第三次匹配剩下的b,發現也不對,輸出空的字串

第四次匹配空字串,直接輸出空的字串

可以發現貪婪模式的特點就是儘可能進行最大長度匹配

非貪婪匹配

簡單來說,非貪婪模式會盡可能短地去匹配,在元字元後面加上英文的問號(?),找出長度最小且滿足要求,比如a*?,如果匹配不上,會匹配更長的欄位進行嘗試

對比一下

不加問號的正則是貪婪匹配,匹配上了從第一個引號到最後一個引號之間的所有內容;加了問號的正則是非貪婪匹配,找到了符合要求的結果

獨佔模式

貪婪模式以及非貪婪模式都需要發生回溯才能完成相應的功能,但是很多時候,我們只想匹配不上就返回失敗就行,那麼另外一種模式就派上了用場,獨佔模式

在量詞元字元後加英文的加號(+),在滿足要求情況下,儘可能的按最長去匹配,匹配不上就直接失敗

兩個例子

貪婪模式

regex = “xy{1,3}z”

text = “xyyz”

在匹配時,y{1,3}會盡可能長地去匹配,當匹配完xyy後,因為y是要儘可能的最長匹配,但字串中後面是個z,這就會導致匹配不上,這時候正則就會向前回溯,吐出當前字元 z,接著用正則中的z去匹配

非貪婪模式

regex = “xy{1,3}?z”

text = “xyyz”

由於 y{1,3}? 代表匹配 1 到 3 個 y,非貪婪模式又是儘可能少地匹配,匹配上一個 y 之後,也就是在匹配上 text 中的 xy 後,正則會使用 z 和 text 中的 xy 後面的 y 比較,發現正則 z 和 y 不匹配,這時正則就會向前回溯,重新檢視 y 匹配兩個的情況,匹配上正則中的 xyy,然後再用 z 去匹配 text 中的 z

獨佔模式

regex = “xy{1,3}+yz”

text = “xyyz”

獨佔模式會盡可能多地去匹配,如果匹配失敗就結束,匹配了兩個y,不回溯導致正則z前面的y匹配不上