using System;
using System.Text.RegularExpressions;
namespace RegexTest
{
class Program
{
static void Main(string[] args)
{
string re = @"(?xi)
{ (?'name' \w+ ) : # start of tag
(?'value' # named capture
(?> # don't backtrack
(?:
[^{}]+ # not brackets
| (?'open' { ) # count opening bracket
| (?'close-open' } ) # subtract closing bracket (matches only if open count > 0)
)*
)
(?(open)(?!)) # make sure open is not > 0
)
} # end of tag
";
string str = @"This is {name1:value1}{name2:{name3:even dipper {name4:valu4} dipper} some inner text} text";
foreach (Match m in Regex.Matches(str, re))
{
Console.WriteLine("name: {0}, value: {1}", m.Groups["name"], m.Groups["value"]);
}
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7CgpuYW1lc3BhY2UgUmVnZXhUZXN0CnsKICAgIGNsYXNzIFByb2dyYW0KICAgIHsKICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCiAgICAgICAgewogICAgICAgICAgICBzdHJpbmcgcmUgPSBAIig/eGkpCnsgKD8nbmFtZScgXHcrICkgOiAgICAgICAjIHN0YXJ0IG9mIHRhZwooPyd2YWx1ZScgICAgICAgICAgICAgICAgIyBuYW1lZCBjYXB0dXJlCiAgKD8+ICAgICAgICAgICAgICAgICAgICAjIGRvbid0IGJhY2t0cmFjawogICAgKD86CiAgICAgIFtee31dKyAgICAgICAgICAgICAjIG5vdCBicmFja2V0cwogICAgfCAoPydvcGVuJyB7ICkgICAgICAgIyBjb3VudCBvcGVuaW5nIGJyYWNrZXQKICAgIHwgKD8nY2xvc2Utb3BlbicgfSApICMgc3VidHJhY3QgY2xvc2luZyBicmFja2V0IChtYXRjaGVzIG9ubHkgaWYgb3BlbiBjb3VudCA+IDApCiAgICApKgogICkKICAoPyhvcGVuKSg/ISkpICAgICAgICAgICMgbWFrZSBzdXJlIG9wZW4gaXMgbm90ID4gMAopCn0gICAgICAgICAgICAgICAgICAgICAgICAjIGVuZCBvZiB0YWcKIjsKICAgICAgICAgICAgc3RyaW5nIHN0ciA9IEAiVGhpcyBpcyB7bmFtZTE6dmFsdWUxfXtuYW1lMjp7bmFtZTM6ZXZlbiBkaXBwZXIge25hbWU0OnZhbHU0fSBkaXBwZXJ9IHNvbWUgaW5uZXIgdGV4dH0gdGV4dCI7CgogICAgICAgICAgICBmb3JlYWNoIChNYXRjaCBtIGluIFJlZ2V4Lk1hdGNoZXMoc3RyLCByZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJuYW1lOiB7MH0sIHZhbHVlOiB7MX0iLCBtLkdyb3Vwc1sibmFtZSJdLCBtLkdyb3Vwc1sidmFsdWUiXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0=