【筆記】正則表示式·記②
正則表示式·記②
貪婪匹配、非貪婪匹配和獨佔模式
貪婪匹配
在正則中,表示次數的量詞預設是貪婪的,在貪婪模式下,會嘗試儘可能最大長度去匹配,如果後面的匹配不上,會吐出已經匹配過的再去嘗試
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匹配不上