Почему бы не написать небольшой парсер для этого? Просто просматривайте символы и используйте простой конечный автомат для разбора.
Такого рода задачи трудно решить в регулярных выражениях, поскольку проблема (грамматика) не является регулярной. Посмотрите на парсинг HTML с регулярным выражением в SO;)
НО: Если вы в определенной степени управляете своим вводом, то вам, возможно, удастся избежать неприятностей с регулярными выражениями. Смотрите другие ответы здесь для "достаточно хороших" способов сделать это.
Это в основном сводится к:
- решите, насколько глубоко заходит кроличья нора (какую «рекурсию» вы хотите смоделировать)
- создать альтернативное (ветвление) регулярное выражение для каждой такой рекурсии
- загляните в следующий раз, когда вам понадобится изменить регулярное выражение
Я делаю это все время. И я ненавижу себя за это!