Мне нужно сопоставить строку в сбалансированных скобках перед литеральным периодом в c #.Мое регулярное выражение со сбалансированными группами работает , за исключением , когда в строке есть дополнительные открытые парены.Насколько я понимаю, это требует условного шаблона сбоя, чтобы гарантировать, что стек совпадает, но что-то не так.
Исходное регулярное выражение:
@"(?<Par>[(]).+(?<-Par>[)])\."
С шаблоном сбоя:
@"(?<Par>[(]).+(?<-Par>[)])(?(Par)(?!))\."
Тест-код (последние 2 сбоя):
string[] tests = {
"a.c", "",
"a).c", "",
"(a.c", "",
"a(a).c", "(a).",
"a(a b).c", "(a b).",
"a((a b)).c", "((a b)).",
"a(((a b))).c", "(((a b))).",
"a((a) (b)).c", "((a) (b)).",
"a((a)(b)).c", "((a)(b)).",
"a((ab)).c", "((ab)).",
"a)((ab)).(c", "((ab)).",
"a(((a b)).c", "((a b)).",
"a(((a b)).)c", "((a b))."
};
Regex re = new Regex(@"(?<Par>[(]).+(?<-Par>[)])(?(Par)(?!))\.");
for (int i = 0; i < tests.Length; i += 2)
{
var result = re.Match(tests[i]).Groups[0].Value;
if (result != tests[i + 1]) throw new Exception
("Expecting: " + tests[i + 1] + ", got " + result);
}