需求:給定字串 "abcdanmcadedcdeefako",提取字母 a 與 c 之間的內容,結果為 ["b", "nm", "ded"]。使用正則表達式的「零寬斷言」可優雅解決。
(?<=a)[^ac]*(?=c)(?<=a):正向後顧斷言,匹配位置前必須是 a(不消耗字符)。[^ac]*:匹配任意非 a、非 c 的字符(貪婪匹配)。(?=c):正向前瞻斷言,匹配位置後必須是 c(不消耗字符)。string input = "abcdanmcadedcdeefako";
// 區分大小寫:Regex reg = new Regex("(?<=a)[^ac]*(?=c)");
// 忽略大小寫:
Regex reg = new Regex("(?i)(?<=a)[^ac]*(?=c)");
MatchCollection matches = reg.Matches(input);
foreach (Match m in matches) {
Console.WriteLine(m.Value); // 輸出: b, nm, ded
}
Split 只能按單一分隔符分割,無法處理「左邊界是 a、右邊界是 c」這類雙邊界提取場景。正則斷言精確定位邊界且不包含邊界字符,最適合此需求。
若需保留 a、c,改用捕獲組:(a[^ac]*c),取 Groups[1].Value。