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

Beitrag lesen

Sehr gerne...
Ein Array oder Hash brauch ich nicht, Skalar reicht vollkommen. Die while-Schleife soll einfach eine Klammer nach der anderen abarbeiten und den abgearbeiteten Ausdruck durch das Ergebnis ersetzen. Im Prinzip ist dabei auch egal ob die Abfrage von vorne nach hinten oder von hinten nach vorne läuft, da  sich die Ausdrücke in der Klammern nicht gegenseitig beeinflussen.

Ausgangsbeispiel:

  
$cmd=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  
  
#Loop1:  
$Ausdruck=[TEST1-{1,15}-TEST2!=200&VLAN!~2\[123\]{1,2}2|TEST3-{}!=201&TEST4-{}=203]  
*calc*  
$Ergebnis=111  
$cmd=SET-CE-LAN-[SUBIF-111-IPV6-ACTIVE=1|SUBIF-[VLAN!=200|VLAN=201]-IPV4-ACTIVE=1]-SUBIF-[SEC-{1}-HELPER-{}=1.1.1.1]-DESCRIPTION=TEST  
  
#Loop2:  
$Ausdruck=[VLAN!=200|VLAN=201]  
*calc*  
$Ergebnis=222  
$cmd=SET-CE-LAN-[SUBIF-111-IPV6-ACTIVE=1|SUBIF-222-IPV4-ACTIVE=1]-SUBIF-[SEC-{1}-HELPER-{}=1.1.1.1]-DESCRIPTION=TEST  
  
#Loop3:  
$Ausdruck=[SUBIF-111-IPV6-ACTIVE=1|SUBIF-222-IPV4-ACTIVE=1]  
*calc*  
$Ergebnis=333  
$cmd=SET-CE-LAN-333-SUBIF-[SEC-{1}-HELPER-{}=1.1.1.1]-DESCRIPTION=TEST  
  
#Loop4:  
$Ausdruck=[SEC-{1}-HELPER-{}=1.1.1.1]  
*calc*  
$Ergebnis=444  
$cmd=SET-CE-LAN-333-SUBIF-444-DESCRIPTION=TEST  

An sich funktioniert das ja schon alles, bis auf, dass ich eckige Klammern nicht escapen kann um sie vom "Split" auszunehmen.
Ich versuche grad auch mal ohne Lookbehinds zu arbeiten, aber auch da komme ich auf keinen grünen Zweig:

  
while ($tmp=~/^(.*?(^|[^\\]))\[([^\[\]]*?|\\[\[\]])*\](.*)\s*\r*\n*$/)  
{  
   $tmp=$1.$4;  
   $execute=$3;  
}