| 模式 | 別名 | 語法後綴 | 匹配策略 | 回溯行為 |
|---|---|---|---|---|
| 貪婪 | Greedy | ?, *, +, {n,} | 最大匹配 | 匹配失敗時逐字符回溯 |
| 勉強 | Reluctant/Lazy | ??, *?, +?, {n,}? | 最小匹配 | 匹配一字符即嘗試後續模式 |
| 占有 | Possessive | ?+, *+, ++, {n,}+ | 最大匹配 | 不回溯,一口吞下成敗不論 |
預設模式。正則 <.+> 匹配字符串 a<tr>java</tr>abb:
< 匹配首個 <.+ 一口吞下剩餘所有字符 tr>java</tr>abb>,開始回溯:逐個吐出字符重試> 處匹配成功,結果為 <tr>java</tr>特點:盡可能多匹配,必要時回溯修正。
在量詞後加 ? 啟用:??, *?, +?, {n,}?。同樣匹配 <.+?>:
< 匹配首個 <.+? 先匹配 t,立即嘗試匹配 > → 失敗r,嘗試 > → 成功<tr>特點:盡可能少匹配,每增加一字符即嘗試後續模式。JDK 文檔用 "eat"(吃)隱喻:貪婪是大口吃再吐,勉強是小口吃嘗試。
在量詞後加 + 啟用:?+, *+, ++, {n,}+。行為如貪婪模式般最大匹配,但完全禁止回溯。
匹配 <.++> 時:
.++ 吞下所有剩餘字符直到字符串末尾> → 失敗適用場景:確定模式不需回溯時,性能最優,避免災難性回溯。
*?, +?)提取內容,避免過度匹配".*+")使用占有模式提升性能Pattern.compile(regex).matcher(input).results() 觀察匹配過程