using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace SO13389560Balancing
{
class Program
{
static void Main(string[] args)
{
string s = "~(a b (c) d (e f (g) h) i) j (k (l (m) n) p) q";
string pattern = @"
(?<=
(?(Depth)(?!)) # 4. Finally, make sure there are no extra closed parentheses.
~\(
(?> # (non backtracking)
[^()] # 3. Allow any other character
|
\( (?<-Depth>)? # 2. When seeing an open paren, decreace depth if possible.
# Also allow excess parentheses: '~((((((a' is OK.
|
(?<Depth> \) ) # 1. When seeing a closed paren, add to depth.
)*
)
\w # Match your letter";
s = Regex.Replace(s, pattern, "!", RegexOptions.IgnorePatternWhitespace);
Console.WriteLine(s);
//Console.ReadKey();
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5UZXh0Owp1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7CgpuYW1lc3BhY2UgU08xMzM4OTU2MEJhbGFuY2luZwp7CiAgICBjbGFzcyBQcm9ncmFtCiAgICB7CiAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQogICAgICAgIHsKICAgICAgICAgICAgc3RyaW5nIHMgPSAifihhIGIgKGMpIGQgKGUgZiAoZykgaCkgaSkgaiAoayAobCAobSkgbikgcCkgcSI7CiAgICAgICAgICAgIHN0cmluZyBwYXR0ZXJuID0gQCIKKD88PQogICAgKD8oRGVwdGgpKD8hKSkgICAgICAgICAgIyA0LiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGV4dHJhIGNsb3NlZCBwYXJlbnRoZXNlcy4KICAgIH5cKAogICAgKD8+ICAgICAgICAgICAgICAgICAgICAgIyAobm9uIGJhY2t0cmFja2luZykKICAgICAgICBbXigpXSAgICAgICAgICAgICAgICMgMy4gQWxsb3cgYW55IG90aGVyIGNoYXJhY3RlcgogICAgICAgIHwKICAgICAgICBcKCAoPzwtRGVwdGg+KT8gICAgICMgMi4gV2hlbiBzZWVpbmcgYW4gb3BlbiBwYXJlbiwgZGVjcmVhY2UgZGVwdGggaWYgcG9zc2libGUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgIEFsc28gYWxsb3cgZXhjZXNzIHBhcmVudGhlc2VzOiAnfigoKCgoKGEnIGlzIE9LLgogICAgICAgIHwKICAgICAgICAoPzxEZXB0aD4gIFwpICkgICAgICMgMS4gV2hlbiBzZWVpbmcgYSBjbG9zZWQgcGFyZW4sIGFkZCB0byBkZXB0aC4KICAgICkqCikKXHcgICAgICAgICAgICAgICAgICAgICAgICAgICMgTWF0Y2ggeW91ciBsZXR0ZXIiOwogICAgICAgIAoKICAgICAgICAgICAgcyA9IFJlZ2V4LlJlcGxhY2UocywgcGF0dGVybiwgIiEiLCBSZWdleE9wdGlvbnMuSWdub3JlUGF0dGVybldoaXRlc3BhY2UpOwoKICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUocyk7CiAgICAgICAgICAgIC8vQ29uc29sZS5SZWFkS2V5KCk7CiAgICAgICAgfQogICAgfQp9Cg==