Moin!
Hallo,
[LIST]
[*]a[/*]
[*]b[/*]
[LIST]
[*]d[/*]
[*]e[/*]
[*]f[/*]
[/LIST]
[*]c[/*]
[/LIST]~[LIST](.*?)[/LIST]~i
Du suchst ein [LIST], dem beliebig viele, aber möglichst wenige Zeichen folgen, gefolgt von [/LIST].
In deinem Text gibts dieses genau EIN Mal - nämlich in der Mitte um die Punkte d, e, und f herum.
Deine äußere Liste wird nicht gefunden, weil beginnend vom ersten [LIST] eben nur zwei Buchstabenpunkte kommen, dann aber kein [/LIST]. Im Widerspruch zur Forderung "Möglichst wenig Zeichen dazwischen" möchtest du aber gerne "möglichst alle Zeichen dazwischen" gefunden haben bis zum letzten [/LIST].
Dies funktioniert aber schon deshalb nicht, weil reguläre Ausdrücke keine verschachtelten Konstrukte auseinandernehmen können. Du findest derzeit einen Block in der Mitte. Über diesen Block übergreifende, nach deiner Ansicht weiterer Suchergebnisse kann es aber nicht geben.
Reguläre Ausdrücke sind kein adäquates Mittel, um komplexe Datenstrukturen zu parsen. Dazu benötigst du einen vernünftigen Parser. Konkret: Wenn du den inneren Block gefunden hast, kannst du ihn durch einen Leerstring ersetzen und würdest erneut einen Block (den äußeren) finden können. Dies erfordert aber eben mehr, als nur einen regulären Ausdruck, es erfordert Programmlogik.
- Sven Rautenberg