Нетрудно проанализировать неопределенное количество совпадающих фигурных скобок с помощью регулярных выражений, потому что, как правило, либо вы будете соответствовать слишком много или слишком мало.
Например, рассмотрим Hello {myObj.name}! {mySelf.{myObj.{keys["ObjProps"][0]}.personAttribute.first}.size}?
, чтобы использовать два примера из вашего ввода в одной строке:
Если вы используете первое регулярное выражение, которое, вероятно, приходит на ум \{.*\}
для сопоставления фигурных скобок, вы получите одно совпадение: {myObj.name}! {mySelf.{myObj.{keys["ObjProps"][0]}.personAttribute.first}.size}
Это потому, что по умолчанию регулярные выражения жадные и будут соответствовать как можно больше.
Оттуда мы можем попытаться использовать не жадный шаблон \{.*?\}
, который будет как можно меньше совпадать между открывающей и закрывающей скобкой. Используя одну и ту же строку, этот шаблон приведет к двум совпадениям: {myObj.name}
и {mySelf.{myObj.{keys["ObjProps"][0]}
. Очевидно, что второе не является полным выражением, но нежадный шаблон будет соответствовать как можно меньшему количеству, и это наименьшее соответствие, которое удовлетворяет шаблону.
PCRE действительно допускает рекурсивные регулярные выражения , но вы получите очень сложный шаблон, если вы пойдете по этому маршруту.
Лучшее решение, на мой взгляд, было бы создать токенизатор (который мог бы быть приведен в действие регулярным выражением), чтобы превратить ваш текст в массив токенов, которые затем могут быть проанализированы.