Я имею следующую структуру:
(Q){(W){g}(E){z}}
Мне необходимо достать то, что находится в круглых и фигурных скобках первого уровня. Т.е.
Q и (W){g}(E){z}
Пробовал "\((.+?)\){.*?}" но это обрезает последнюю фигурную скобку.
Я имею следующую структуру:
(Q){(W){g}(E){z}}
Мне необходимо достать то, что находится в круглых и фигурных скобках первого уровня. Т.е.
Q и (W){g}(E){z}
Пробовал "\((.+?)\){.*?}" но это обрезает последнюю фигурную скобку.
Используйте рекурсивный шаблон, например в таком варианте
/\(((?>[^()]+|(?R))*)\)|{((?>[^{}]+|(?R))*)}/g
Результат будет в первой или второй группе в зависимости от вида скобок.
Пример тут https://regex101.com/r/HRABRe/1
Для обработки вложенности скобок в регулярных выражениях используются рекурсивные проверки. Для первой группы круглых скобок, в случае если в них могут быть еще круглые скобки, это выглядит так:
( # начинаем первую группу захвата
\( # первый символ - круглая скобка
( # вторая группа захвата - требуемый результат
(?:
(?1) | # внутри которой может быть повторено выражение всей первой группы
.)*? # или любой символ, много раз
)
\)
)
Все выражение целиком выглядит так:
(\(((?:(?1)|.)*?)\))({((?:(?3)|.)*?)})
Требуемые результаты в 2 и 4 группах захвата. Если внутри первых круглых скобок вложенности быть не может, то начало можно сократить до того, как вы изначально пробовали, т.е. до \((.*?)\). Тогда еще надо будет не забыть поменять ссылку (?3)
Тест на regex101.com
UPD: Исходя из комментария "Круглые скобки содержат имя параметра, фигурные содержат параметры. Параметр может содержать другие параметры", в случае если поддержки рекурсии в вашем диалекте регулярных выражений нет можно применить:
\((.*?)\){(.*)}
Первый захват не жадный, до первой встреченной круглой скобки, второй - жадный, захватит все до последней фигурной скобки, если других фигурных скобок в строке не будет, такого выражения будет достаточно
В C# можно использовать балансирующие группы:
\((?<val1>(?>[^()]+|(?<o>\()|(?<-o>\)))*(?(o)(?!)))\){(?<val2>(?>[^{}]+|(?<w>{)|(?<-w>}))*(?(w)(?!)))}
\( - открывающая скобка )(?<val1>(?>[^()]+|(?<o>\()|(?<-o>\)))*(?(o)(?!))) - все, что между ( и )\) - закрывающая скобка ){ - открывающая скобка { (?<val2>(?>[^{}]+|(?<w>{)|(?<-w>}))*(?(w)(?!))) - все, что между { и }} - закрывающая скобка }.