字符串含中文半角括號,嵌套不定層數,需提取**最外層**括號內完整內容。例:
110kV1#母分開關由運行改熱備用(110kV1#母分備自投由信號改跳閘(1區),110kV1#母分保護由跳閘改信號(1區)),110kV1#母分開關由運行改熱備用(110kV1#母分備自投由信號改跳閘(1區),110kV1#母分保護由跳閘改信號(1區))
需匹配兩個最外層括號組:
(110kV1#母分備自投由信號改跳閘(1區),110kV1#母分保護由跳閘改信號(1區))
(110kV1#母分備自投由信號改跳閘(1區),110kV1#母分保護由跳閘改信號(1區))
string pattern = @"\([^\(\)]*(((?'open'\()[^\(\)]*)+((?'-open'\))[^\(\)]*)+)*(?(open)(?!))[^\(\)]*\)";
(?'open'\():捕獲左括號,壓入 open 組計數器。(?'-open'\)):匹配右括號,彈出 open 計數器。(?(open)(?!)):條件判斷,若 open 組非空(括號未平衡)則匹配失敗((?!) 永假)。Regex.Matches(text, pattern).Cast<Match>().ToList().ForEach(m => Console.WriteLine(m.Value));
此正則依賴 .NET **平衡組** 特性,Java/JS/Python 不支持,需用遞歸下降解析器或手寫棧邏輯實現括號匹配。