То, что вы пытаетесь сделать, это рекурсивное совпадение.Как я уже говорил в своем комментарии, есть похожие ответы на вопросы, которые могут работать для вас (если они адаптированы) здесь и здесь .
Для вашего случая,Я адаптировал этот ответ для вашей ситуации, в результате чего следующий RegEx:
(?=(\{(?>[^{}]+|(?1))+\}))
Я заменил скобки (предыдущего решения) для фигурных скобок, а затемзаключил всю группу захвата в позитивную перспективу.Так как lookarounds не потребляют никаких символов , движок будет пытаться сопоставить строку.Кроме того, если вы включите утверждение в предпросмотр внутри группы захвата, выражение будет «согласовано» (но не использовано), и вы сможете извлечь его из групп захвата.Таким образом, возможно сопоставить ваш шаблон несколько раз, что даст вам ожидаемые результаты.
Regex101 demo: https://regex101.com/r/nsypuX/1/