Gunther: [RegExp] Inhalt zwischen {...} matchen

Hallo werte Selfgemeinde!

Ich brauche (vermutlich) mal wieder RegExp.
Folgende Situation:
Ich lese eine Datei (txt) in einen String ein. Die Datei enthält nun u.a. Einträge der Form:

val_x = { Wert X, {Wert.1, Wert.2}, Wert Y, {Wert.1, Wert.2}, Wert Z}
oder
  val_y = { Wert X, nil, Wert Y, {Wert.1, Wert.2}}

Ich möchte nun gerne den gesamten Inhalt zwischen der ersten öffnenden Klammer '{' und der letzten schließenden Klammer '}' matchen, wobei die Anzahl der dazwischenliegenden Klammern-Paare variabel ist.

Frage: Wie mache ich das am besten, bzw. geht das überhaupt, oder muss ich mehrere Schritte machen?

Für eure Hilfe meinen besten Dank im Voraus!

Gruß Gunther

  1. val_x = { Wert X, {Wert.1, Wert.2}, Wert Y, {Wert.1, Wert.2}, Wert Z}
    oder
      val_y = { Wert X, nil, Wert Y, {Wert.1, Wert.2}}

    Ich möchte nun gerne den gesamten Inhalt zwischen der ersten öffnenden Klammer '{' und der letzten schließenden Klammer '}' matchen, wobei die Anzahl der dazwischenliegenden Klammern-Paare variabel ist.

    Frage: Wie mache ich das am besten, bzw. geht das überhaupt, oder muss ich mehrere Schritte machen?

    Perlansatz

      
    my $outerpar = qr/[a-z]+/;  
    my $innerpar = qr/[A-Za-z\ ]+/;  
    my $innerval = qr/(?:nil|\([^()]+\))/;  
      
    my $string =~ m/  
       $outerpar  
       \s*  
       =  
       \s*  
       \(  
       (  
          $innerpar  
          , \s*  
          $innerval  
          (?:  
            , \s*  
            $innerpar  
            , \s*  
            $innerval  
          )*  
       )  
       \)  
       /x;  
      
    # komprimiert:  
    my $string =~ m/$outerpar\s*=\s*\(($innerpar,\s*$innerval(?:,\s*$innerpar,\s*$innerval)*)\)/;  
    
    

    Ungetestet.
    Konversion nach PHP als deine eigene Übung.

    mfg Beat

    --
    Woran ich arbeite:
    X-Torah
       <°)))o><                      ><o(((°>o
    1. Ungetestet.
      Konversion nach PHP als deine eigene Übung.

      Achtung:
      Ich habe übersehen, dass es sich um { } statt um ( ) handelt.

      my $outerpar = qr/[a-z]+/;
      my $innerpar = qr/[A-Za-z\ ]+/;
      my $innerval = qr/(?:nil|{[^{}]+})/;

      my $string =~ m/
         $outerpar
         \s*
         =
         \s*
         {
         (
            $innerpar
            , \s*
            $innerval
            (?:
              , \s*
              $innerpar
              , \s*
              $innerval
            )*
         )
         }
         /x;

      komprimiert:

      my $string =~ m/$outerpar\s*=\s*{($innerpar,\s*$innerval(?:,\s*$innerpar,\s*$innerval)*)}/;

      mfg Beat

      --
         <°)))o><                      ><o(((°>o
      1. Hallo Beat!

        Vielen Dank für deine Mühe, auch wenn ich so gut wie gar nichts davon verstanden habe. Ich bin ja schon froh, wenn ich mit PHP einigermaßen zurechtkomme. Von Perl (und seiner Syntax) habe ich überhaupt keine Ahnung.

        Aber angeregt durch dein Beispiel, habe ich mir jetzt folgende Lösung zurechtgebastelt (sieht etwas wild aus, da (fast) überall beliebig viele Leerzeichen und Zeilenumbrüche vorkommen können):

          
        $suchmuster = '/NeedsAndRightsByKnightTitle\[KnightTitles.Mayor\][\ .]*=[\ \s]*{[\ \s]*[A-Za-z\ .]+,[\ \s]*(?:nil[\ \s]*|{+[\ \s]*[A-Za-z,\ .\s]+[\ \s]*}+)[\ \s]*,[\ \s]*[A-Za-z\ .]+[\ \s]*,[\ \s]*{+[A-Za-z\ _,.\s]*}[\ \s]*,[\ \s]*[A-Za-z]+[\ \s]*}/s';  
        preg_match($suchmuster, $luafile, $treffer, PREG_OFFSET_CAPTURE);  
        
        

        Funktioniert soweit wie es soll.
        Kann man das ggf. noch vereinfachen/ optimieren?

        Gruß Gunther

        1. $suchmuster = '/NeedsAndRightsByKnightTitle[KnightTitles.Mayor][\ .]=[\ \s]{[\ \s][A-Za-z\ .]+,[\ \s](?:nil[\ \s]|{+[\ \s][A-Za-z,\ .\s]+[\ \s]}+)[\ \s],[\ \s][A-Za-z\ .]+[\ \s],[\ \s]{+[A-Za-z\ _,.\s]}[\ \s],[\ \s][A-Za-z]+[\ \s]*}/s';
          preg_match($suchmuster, $luafile, $treffer, PREG_OFFSET_CAPTURE);

          
          >   
          > Funktioniert soweit wie es soll.  
          > Kann man das ggf. noch vereinfachen/ optimieren?  
            
          Hi Gunther  
            
          Leider kenne ich PHP nur aus meinen gelegentlichen Handbuchkonsultationen.  
          Selber bleibe ich wohl Perl treu, bis ein anderer Fall mir die Beschäftigung mit PHP nahelegt.  
            
          Ich bin überzeugt, dass es auch in PHP eine Möglichkeit gibt, REs wie in meinem Beispiel übersichtlich zusammenzubasteln.  
            
          Das Wichtigste ist wohl, dass du sie vor dem Schleifendurchgang zusammenbastelst. Dazu gibt in Perl eben die qr// Syntax.  
            
          Ich vermute, du könntest in PHP etwas analoges machen mit:  
            
          $suchpart\_1 = '[0-9]';  
          $suchpart\_2 = '[a-z\ ]+';  
          $suchmuster = '/'  
                      . $suchpart\_1  
                      . '('  
                      .    $suchpart\_2  
                      . ')'  
                      . '/';  
            
          Mach mal einen Test. Sieht doch übersichtlich aus...  
            
          mfg Beat
          
          -- 
          Woran ich arbeite:  
          [X-Torah](http://www.elcappuccino.ch/cgi/tok.pl?extern=1-pub-com3306-1)  
             <°)))o><                      ><o(((°>o