首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 正則表達式量詞深度解析:貪婪、勉強、占有三大匹配模式

     編輯:Java 程式設計入門

量詞匹配模式對比表

模式別名語法後綴匹配策略回溯行為
貪婪Greedy?, *, +, {n,}最大匹配匹配失敗時逐字符回溯
勉強Reluctant/Lazy??, *?, +?, {n,}?最小匹配匹配一字符即嘗試後續模式
占有Possessive?+, *+, ++, {n,}+最大匹配不回溯,一口吞下成敗不論

1. 貪婪模式:最大匹配與回溯

預設模式。正則 <.+> 匹配字符串 a<tr>java</tr>abb:

  1. < 匹配首個 <
  2. .+ 一口吞下剩餘所有字符 tr>java</tr>abb
  3. 發現無法匹配結尾 >,開始回溯:逐個吐出字符重試
  4. 最終在倒數第二個 > 處匹配成功,結果為 <tr>java</tr>

特點:盡可能多匹配,必要時回溯修正。

2. 勉強模式:最小匹配與即時嘗試

在量詞後加 ? 啟用:??, *?, +?, {n,}?。同樣匹配 <.+?>:

  1. < 匹配首個 <
  2. .+? 先匹配 t,立即嘗試匹配 > → 失敗
  3. 再匹配 r,嘗試 > → 成功
  4. 結果為 <tr>

特點:盡可能少匹配,每增加一字符即嘗試後續模式。JDK 文檔用 "eat"(吃)隱喻:貪婪是大口吃再吐,勉強是小口吃嘗試。

3. 占有模式:一口吞下,絕不回頭

在量詞後加 + 啟用:?+, *+, ++, {n,}+。行為如貪婪模式般最大匹配,但完全禁止回溯。

匹配 <.++> 時:

  1. .++ 吞下所有剩餘字符直到字符串末尾
  2. 嘗試匹配 > → 失敗
  3. 直接報告匹配失敗,不回溯

適用場景:確定模式不需回溯時,性能最優,避免災難性回溯。

實戰建議

  • 優先使用勉強模式(*?, +?)提取內容,避免過度匹配
  • 明確不需回溯的場景(如匹配引號內容 ".*+")使用占有模式提升性能
  • 警惕貪婪模式在複雜正則中導致的災難性回溯(ReDoS)
  • 調試時可用 Pattern.compile(regex).matcher(input).results() 觀察匹配過程
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved