具有多個匹配的邊界
當你的輸入具有明確定義的邊界並且期望在字串中有多個匹配時,你有兩個選擇:
- 使用惰性量詞;
- 使用否定的字元類。
考慮以下:
你有一個簡單的模板引擎,你想要替換像 $[foo]
這樣的子字串,其中 foo
可以是任何字串。你希望將此子字串替換為基於 []
之間的部分。
你可以嘗試像\$\[(.*)\]
這樣的東西,然後使用第一個捕獲組。
這個問題是如果你有一個類似 something $[foo] lalala $[bar] something else
的字串,你的匹配就是
something $[foo] lalala $[bar] something else
| \______CG1______/|
\_______Match______/
捕獲組是 foo] lalala $[bar
,可能有效也可能無效。
你有兩個解決方案
-
使用懶惰:在這種情況下,讓懶惰成為尋找正確事物的一種方法。所以你把表達改為
\$\[(.*?)\]
-
使用否定的字元類:tihuan9 你將表示式改為
\$\[([^\]]*)\]
。
在兩種解決方案中,結果都是相同的:
something $[foo] lalala $[bar] something else
| \_/| | \_/|
\____/ \____/
捕獲組分別為 foo
和 bar
。
使用否定字元類可以減少回溯問題,並且可以在大輸入時節省 CPU 大量時間。