Dans les expressions régulières classiques, cela est impossible - DFA ne peut pas analyser des paires imbriquées.
Il existe des façons de le faire avec des expressions régulières étendues, telles que les expressions récursives autorisées dans certains moteurs d'expressions rationnelles (telles que Perl regex), mais elles ne sont pas toujours jolies. (trop php fourni la version Perl. /\{(?:[^{}]+|(?R))*\}/
avec l'option (?R)
étant le match récursive)
Vous n'êtes pas forcément besoin d'regex pour faire ce genre de chose cependant. Vous pourriez le faire simplement en parcourant la liste et en gardant une pile d'accolades ouvertes (et à quelle position ils ont été vus). Ensuite, chaque fois que vous voyez une accolade ouverte, vous poussez sa position sur la pile, et chaque fois que vous voyez une accolade proche, vous faites sortir l'accolade ouverte la plus récemment de la pile et utilisez sa position plus la position actuelle comme limites pour une sous-chaîne qui devient l'un de vos matchs. Répétez jusqu'à ce que vous atteigniez la fin de la chaîne.
Seulement, je pense, en Perl 5.10 expressions régulières, et non trivialement même alors (http://perldoc.perl.org/perlre.html#Extended-Patterns). –