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));
