Соответствующие сбалансированные скобки перед символом - PullRequest
0 голосов
/ 28 мая 2018

Мне нужно сопоставить строку в сбалансированных скобках перед литеральным периодом в 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);
}

1 Ответ

0 голосов
/ 28 мая 2018

Вы можете использовать хорошо известное регулярное выражение для сопоставления со сбалансированными скобками и просто добавить к нему \.:

\((?>[^()]+|(?<o>)\(|(?<-o>)\))*(?(o)(?!))\)\.
|---------- balanced parens part ----------|.|

См. Демонстрационную версию regex .

Подробности

  • \( - (
  • (?> - начало атомной группы
    • [^()]+ -1 или более символов, отличных от ( и )
    • | - или
    • (?<o>)\( - открытие ( помещается в стек o группы
    • | - или
    • (?<-o>)\) - из группы o закрывается стопка *1039*
  • )* -0 или более повторений атомарной группы
  • (?(o)(?!)) - не удается выполнить сопоставление, если стек группы o не пуст
  • \) - a )
  • \. - точка.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...