Stefan Welscher: [Regex]Vor einem Zeichen X darf kein Zeichen Y stehen

Beitrag lesen

Hi,
folgendes kleines Problem....:
Ich versuche bei einem String, in dem mehrere eckige Klammern vorkommen können, diese eckigen Klammern von "innen" nach "außen" aufzulösen, dabei aber jene eckigen Klammern zu ignorieren, die mit Backslash escaped sind.

Etwas komplexeres Beispiel:
SET-CE-LAN-[SUBIF-[TEST1-{1,15}-TEST2!=200&VLAN!~2[123]{1,2}2|TEST3-{}!=201&TEST4-{}=203]-IPV6-ACTIVE=1|SUBIF-[VLAN!=200|VLAN=201]-IPV4-ACTIVE=1]-SUBIF-[SEC-{1}-HELPER-{}=1.1.1.1]-DESCRIPTION=TEST

Der Skriptteil sieht aktuell wie folgt aus:

  
my $tmp=$cmd;  
while ($tmp=~/^(.*?)(?<!\\)\[([^\[\]])*(?!\\)\](.*)\s*\r*\n*$/)  
{  
    $tmp=$1.$3;  
    $content=$2;  
}  

Leider scheint das Script nicht zu funktionieren, vermutlich weil die negativen Lookbehinds nicht nur die Zeichen direkt vor der eckigen Klammer betrachten, sondern den gesamten Ausdruck davor.
Kann ich den negativen Lookbehind irgendwie auf eine Zeichenmenge begrenzen?

Evtl. gibt es auch andere Lösungen, aber wichtig wäre eben, dass der Gesamte Teil vor der eckigen Klammer in einer Zwischenvariable steht.

Besten Dank!