c# Regex.Split работает не так, как я ожидаю

У меня есть регулярное выражение \(((?>\((?<depth>)|\)(?<-depth>)|.?)*(?(depth)(?!)))\), которое позволяет выбрать все выражения в скобках верхнего уровня с помощью груп захвата.

Пример:

  • Входная строка: 3 + 2 * (1 + 1 - (2 + 4)) + 12 * 31 - ((1+1) - 14 + 1)
  • Матчи: (1 + 1 - (2 + 4)), ((1+1) - 14 + 1)

Я хочу разбить входную строку этими матчами с помощью Regex.Split(). Однако я получаю выражения уже без скобочек:

  • 3 + 2 *
  • 1 + 1 - (2 + 4) - нет верхних скобок
  • + 12 * 31 -
  • (1+1) - 14 + 1 - нет верхних скобок

Как я понял, оно выводит саму группу захвата, но как сделать, что бы остались скобки?


Ответы (1 шт):

Автор решения: Wiktor Stribiżew

Regex.Split() разбивает строку на части с сохранением захваченных подстрок. Так как в оригинальном выражении внешние скобки не захвачены, они отсутствуют в результате.

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

(\((?>[^()]+|\((?<depth>)|\)(?<-depth>))*(?(depth)(?!))\))

См. пример работы выражения:

введите сюда описание изображения

C#:

var pattern = @"(\((?>[^()]+|\((?<depth>)|\)(?<-depth>))*(?(depth)(?!))\))";
var output = Regex.Split(text, pattern).Where(x => !string.IsNullOrEmpty(x));
→ Ссылка