using System;
using System.Text.RegularExpressions;
public class Test
{
public static void Main()
{
string testcase0 = @"fun(abc) fun3()";
string testcase1 = @"fun(\\\)\)) fun3()";
string testcase2 = @"fun(fun2(\)\\\() ) fun3()";
Regex catchRegex = new Regex(@"^fun\(((?:[^()\\]|\\.|(?<o>\()|(?<-o>\)))+(?(o)(?!)))\)(.*$)");
Console.WriteLine(catchRegex.Match(testcase0).Groups[1]); // 'abc'
Console.WriteLine(catchRegex.Match(testcase0).Groups[2]); // ' fun3()'
Console.WriteLine(catchRegex.Match(testcase1).Groups[1]); // '\\\)\)'
Console.WriteLine(catchRegex.Match(testcase1).Groups[2]); // ' fun3()'
Console.WriteLine(catchRegex.Match(testcase2).Groups[1]); // 'fun2(\)\\\()'
Console.WriteLine(catchRegex.Match(testcase2).Groups[2]); // ' fun3()'
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7CiAKcHVibGljIGNsYXNzIFRlc3QKewoJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQoJewoJCXN0cmluZyB0ZXN0Y2FzZTAgPSBAImZ1bihhYmMpIGZ1bjMoKSI7CgkJc3RyaW5nIHRlc3RjYXNlMSA9IEAiZnVuKFxcXClcKSkgZnVuMygpIjsKCQlzdHJpbmcgdGVzdGNhc2UyID0gQCJmdW4oZnVuMihcKVxcXCgpICkgZnVuMygpIjsKIAoJCVJlZ2V4IGNhdGNoUmVnZXggPSBuZXcgUmVnZXgoQCJeZnVuXCgoKD86W14oKVxcXXxcXC58KD88bz5cKCl8KD88LW8+XCkpKSsoPyhvKSg/ISkpKVwpKC4qJCkiKTsKIAoJCUNvbnNvbGUuV3JpdGVMaW5lKGNhdGNoUmVnZXguTWF0Y2godGVzdGNhc2UwKS5Hcm91cHNbMV0pOyAvLyAnYWJjJwoJCUNvbnNvbGUuV3JpdGVMaW5lKGNhdGNoUmVnZXguTWF0Y2godGVzdGNhc2UwKS5Hcm91cHNbMl0pOyAvLyAnIGZ1bjMoKScKIAoJCUNvbnNvbGUuV3JpdGVMaW5lKGNhdGNoUmVnZXguTWF0Y2godGVzdGNhc2UxKS5Hcm91cHNbMV0pOyAvLyAnXFxcKVwpJwoJCUNvbnNvbGUuV3JpdGVMaW5lKGNhdGNoUmVnZXguTWF0Y2godGVzdGNhc2UxKS5Hcm91cHNbMl0pOyAvLyAnIGZ1bjMoKScKIAoJCUNvbnNvbGUuV3JpdGVMaW5lKGNhdGNoUmVnZXguTWF0Y2godGVzdGNhc2UyKS5Hcm91cHNbMV0pOyAvLyAnZnVuMihcKVxcXCgpJwoJCUNvbnNvbGUuV3JpdGVMaW5lKGNhdGNoUmVnZXguTWF0Y2godGVzdGNhc2UyKS5Hcm91cHNbMl0pOyAvLyAnIGZ1bjMoKScKCX0KfQ==