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