量詞預設為貪婪模式 (盡可能多匹配),加上 ? 切換為非貪婪 (盡可能少匹配),兩種模式行為差異巨大。
reg.Subject := '標題 內容'; reg.RegEx := '<.*>'; { 貪婪:從第一個 < 匹配到最後一個 > } reg.Replacement := '◆'; reg.ReplaceAll; { 輸出: ◆ }
reg.RegEx := '<.*?>'; { *? 非貪婪:匹配每組 <> }
reg.ReplaceAll;
{ 輸出: ◆◆◆標題◆◆◆內容◆◆ }
| 貪婪 | 非貪婪 | 匹配次數 | 說明 |
|---|---|---|---|
? | ?? | 0 或 1 | 可選項 |
+ | +? | 1 或多 | 至少一次 |
* | *? | 0 或多 | 任意次數 |
{n} | {n}? | 恰好 n | 固定次數 |
{n,m} | {n,m}? | n 到 m | 範圍次數 |
{n,} | {n,}? | n 或更多 | 下限固定 |
>、"、;) → 用非貪婪 *?/+?reg.Options := [preUnGreedy]; { 全域啟用非貪婪,等同所有量詞自動加 ? }
理解貪婪/非貪婪機制,是避免正則「匹配過多」經典陷阱的關鍵。