using System; using System.Collections.Generic; public class Test { private static void SplitAndPrint(string prefix, string s) { s = s.Trim(); while (s.Length > 0 && s[0] == '(' && s[s.Length - 1] == ')') { s = s.Substring(1, s.Length - 2); prefix += " "; } var parts = new List(); var parenLevel = 0; var lastPos = 0; for (var i = 0 ; i != s.Length ; i++) { switch (s[i]) { case '(': parenLevel++; break; case ')': parenLevel--; if (parenLevel < 0) { throw new ArgumentException(); } break; case ',': if (parenLevel == 0) { parts.Add(s.Substring(lastPos, i-lastPos)); lastPos = i + 1; } break; } } if (lastPos != s.Length) { parts.Add(s.Substring(lastPos, s.Length - lastPos)); } if (parts.Count == 1) { Console.WriteLine("{0}{1}", prefix, parts[0]); return; } prefix += " "; foreach (var part in parts) { SplitAndPrint(prefix, part); } } public static void Main() { SplitAndPrint("", "value1,value2,(value3,(value4, value5, value6, (value7), value8),(((value9),value10),value11))"); } }