具有多個匹配的邊界

當你的輸入具有明確定義的邊界並且期望在字串中有多個匹配時,你有兩個選擇:

  • 使用惰性量詞;
  • 使用否定的字元類。

考慮以下:

你有一個簡單的模板引擎,你想要替換像 $[foo] 這樣的子字串,其中 foo 可以是任何字串。你希望將此子字串替換為基於 [] 之間的部分。

你可以嘗試像\$\[(.*)\] 這樣的東西,然後使用第一個捕獲組。

這個問題是如果你有一個類似 something $[foo] lalala $[bar] something else 的字串,你的匹配就是

something $[foo] lalala $[bar] something else
          | \______CG1______/|
          \_______Match______/

捕獲組是 foo] lalala $[bar,可能有效也可能無效。

你有兩個解決方案

  1. 使用懶惰:在這種情況下,讓懶惰成為尋找正確事物的一種方法。所以你把表達改為\$\[(.*?)\]

  2. 使用否定的字元類:ti​​huan9 你將表示式改為\$\[([^\]]*)\]

在兩種解決方案中,結果都是相同的:

something $[foo] lalala $[bar] something else
          | \_/|        | \_/|
          \____/        \____/

捕獲組分別為 foobar

使用否定字元類可以減少回溯問題,並且可以在大輸入時節省 CPU 大量時間。