using System;
using System.Text.RegularExpressions;
public class Test
{
public static void Main()
{
string msg= "(((a) or (b) or (c)) and ((d) or (e)) and ((!f) or (!g)))";
var charSetOccurences = new Regex(@"\(((?:[^()]|(?<o>\()|(?<-o>\)))+(?(o)(?!)))\)");
var charSetMatches = charSetOccurences.Matches(msg);
foreach (Match mainMatch in charSetMatches)
{
var sets = charSetOccurences.Matches(mainMatch.Groups[1].Value);
foreach (Match match in sets)
{
Console.WriteLine(match.Groups[0].Value);
}
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7CnB1YmxpYyBjbGFzcyBUZXN0CnsKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKICAgIHsgICAKICAgICAgICBzdHJpbmcgbXNnPSAiKCgoYSkgb3IgKGIpIG9yIChjKSkgYW5kICgoZCkgb3IgKGUpKSBhbmQgKCghZikgb3IgKCFnKSkpIjsKICAgICAgICB2YXIgY2hhclNldE9jY3VyZW5jZXMgPSBuZXcgUmVnZXgoQCJcKCgoPzpbXigpXXwoPzxvPlwoKXwoPzwtbz5cKSkpKyg/KG8pKD8hKSkpXCkiKTsKICAgICAgICB2YXIgY2hhclNldE1hdGNoZXMgPSBjaGFyU2V0T2NjdXJlbmNlcy5NYXRjaGVzKG1zZyk7CiAgICAgICAgZm9yZWFjaCAoTWF0Y2ggbWFpbk1hdGNoIGluIGNoYXJTZXRNYXRjaGVzKQogICAgICAgIHsKICAgICAgICAJdmFyIHNldHMgPSBjaGFyU2V0T2NjdXJlbmNlcy5NYXRjaGVzKG1haW5NYXRjaC5Hcm91cHNbMV0uVmFsdWUpOwoJICAgICAgICBmb3JlYWNoIChNYXRjaCBtYXRjaCBpbiBzZXRzKQoJICAgICAgICB7CgkgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShtYXRjaC5Hcm91cHNbMF0uVmFsdWUpOwoJICAgICAgICB9CiAgICAgICAgfQogICAgfQp9