·
用懶惰性取代貪婪性
乙個用於修正以上問題的可能方案是用「+」的惰性代替貪婪性。你可以在「+」後面緊跟乙個問號「?」來達到這一點。「*」,「{}」和「?」表示的重複也可以用這個方案。因此在上面的例子中我們可以使用「
<.+?>」。讓我們再來看看正規表示式引擎的處理過程。
再一次,正規表示式記號「
<」會匹配字串的第乙個「
<」。下乙個正則記號是「.」。這次是乙個懶惰的「+」來重複上乙個字元。這告訴正則引擎,盡可能少的重複上乙個字元。因此引擎匹配「.」和字元「e」,然後用「>」匹配「m」,結果失敗了。引擎會進行回溯,和上乙個例子不同,因為是惰性重複,所以引擎是擴充套件惰性重複而不是減少,於是「
<.+」現在被擴充套件為「
」。引擎繼續匹配下乙個記號「>」。這次得到了乙個成功匹配。引擎於是報告「
」是乙個成功的匹配。整個過程大致如此。
·惰性擴充套件的乙個替代方案
我們還有乙個更好的替代方案。可以用乙個貪婪重複與乙個取反字符集:「
<[^>]+>」。之所以說這是乙個更好的方案在於使用惰性重複時,引擎會在找到乙個成功匹配前對每乙個字元進行回溯。而使用取反字符集則不需要進行回溯。
正規表示式 非貪婪匹配
先來看個例子 final static string text 999www.chinoukin.com 888 final static string regex public static void main string args 預想輸出結果 999 b 888 b 實際輸出結果 999 b...
正規表示式 貪婪與非貪婪匹配
貪婪匹配與非貪婪匹配 貪婪匹配 預設情況下,正規表示式使用最長匹配原則 也叫貪婪匹配原則 例如 要將 zoom 中匹配 zo?的部 分替換成 r 替換的的結果是 rom 如果要將 zoom 中匹配 zo 的部分替換成 r 替換後的結果是 rm 非貪婪匹配 當字元?緊隨其他限定符 之後時,匹配模式變成...
正規表示式 貪婪與非貪婪匹配
貪婪匹配與非貪婪匹配 貪婪匹配 預設情況下,正規表示式使用最長匹配原則 也叫貪婪匹配原則 例如 要將 zoom 中匹配 zo?的部 分替換成 r 替換的的結果是 rom 如果要將 zoom 中匹配 zo 的部分替換成 r 替換後的結果是 rm 非貪婪匹配 當字元?緊隨其他限定符 之後時,匹配模式變成...