Slob: RegEx für geschachtelte Klammern?

Hi,

das Problem das ich hab ist eigentlich gar keins...
Wohl mehr eine Frage der Eleganz...

Mal angenommen ich habe eine Java-Source und ich möchte den gesamten Code einer Methode mir einer RegEx extrahieren, sprich alles zwichen "{" und "}".
Das währe simpel, wenn die Klammern nicht geschachtelt währen...

Wie gesagt, eigentlich kein Problem, ich wüsste nur gerne, ob es eine Möglichkeit gibt, eine solche Logik in *eine* RegEx zu packen...

Danke im Vorraus...

Grus
   Slob

  1. Joho,

    Mal angenommen ich habe eine Java-Source und ich möchte den
    gesamten Code einer Methode mir einer RegEx extrahieren, sprich
    alles zwichen "{" und "}".
    Das währe simpel, wenn die Klammern nicht geschachtelt währen...

    Richtig ;-)

    Wie gesagt, eigentlich kein Problem, ich wüsste nur gerne, ob es
    eine Möglichkeit gibt, eine solche Logik in *eine* RegEx zu
    packen...

    Nein. Mit RegExen kann man immer nur eine begrenzte Tiefe nachbilden;
    fuer sowas sind sie auch nicht gedacht. Dafuer musst du dir schon einen
    Parser schreiben - aber der ist nicht besonders kompliziert :-) Der
    muss nichtmal rekursiv arbeiten.

    Gruss,
     CK

    1. Hohohoooo,

      Dafuer musst du dir schon einen
      Parser schreiben - aber der ist nicht besonders kompliziert :-) Der
      muss nichtmal rekursiv arbeiten.

      Christian meint wahrscheinlich du zaehlst linear die offenen und geschlossen
      Klammern und bei unentschieden wird das Spiel beendet.

      Dafuer kannste auch RegExp einsetzen, bezweifkle das es einfacher wird!

      Bye
      Rolf

      1. Joho,

        Hohohoooo,

        Bittu der Nikolaus? ;-)

        Christian meint wahrscheinlich du zaehlst linear die offenen und
        geschlossen Klammern und bei unentschieden wird das Spiel beendet.

        Ganz recht. Easiest way, eben ;-)

        Dafuer kannste auch RegExp einsetzen, bezweifkle das es einfacher
        wird!

        Eher im Gegenteil. Ich bezweifle auch, dass das mit einem RegEx so
        einfach hinzubekommen ist.

        Gruss,
         CK

        1. Hi

          Eher im Gegenteil. Ich bezweifle auch, dass das mit einem RegEx so
          einfach hinzubekommen ist.

          Hmm, mit der evaluate option vielleicht, ist halt kein hardcore Regexp mehr:

          DRAFT (ich verstehe etwas mehr von RegEx als von Perl ;):

          Bei jeder Klammer wird count aufgerufen, der bis gleichstand mitzählt und
          die letzte Klammer mit END ersetzt. Na und dann zwischen Start und End
          ausschneiden. Ich bin mir sicher mein Code das funzt nicht auf
          anhieb aber es geht hier ums Prinzip ;)

          MIt etwas getrickse bekommt man alles auch in eine regex!

          s/START.*?([{}])/count($1)/ge;
                  ^
           (da bin ich mir unsicher!)

          sub count() {
           if ($counter{'{'} ne $counter{'{'}) {
                $counter{$_[0]}++;
            return $_[0];
           }else{
              return "END";
           }
          }

          Byebye
          Rolf

          1. Joho,

            Hmm, mit der evaluate option vielleicht, ist halt kein hardcore
            Regexp mehr:

            Das sehe ich nicht mehr als 'es mit einem RegEx hinkriegen' - das das
            so geht, ist klar ;-)

            sub count() {
            if ($counter{'{'} ne $counter{'{'}) {
                  $counter{$_[0]}++;
              return $_[0];
            }else{
                return "END";
            }
            }

            Pfui - @_ direkt zu benutzen ist verpoent ;-) (auch wenns hier egal ist)

            Gruss,
             CK

    2. Joho,

      Hi Christian,

      Nein. Mit RegExen kann man immer nur eine begrenzte Tiefe nachbilden;
      fuer sowas sind sie auch nicht gedacht. Dafuer musst du dir schon einen
      Parser schreiben - aber der ist nicht besonders kompliziert :-) Der
      muss nichtmal rekursiv arbeiten.

      Danke, genau das wollte ich wissen...

      Ich hab irgendwann mal irgendwo irgendwas gelesen von einer Möglichkeit PerlCode so in die Expression einzubauen, dass er bei einem Sub-Match ausgeführt wird, dass ist dann aber schon wieder mehr oder weniger eine Art Parser, der halt krampfhaft in eine RegEx gestopft wurde...

      Trotz allem Danke

      Gruss
         Slob

    3. hi!

      Mal angenommen ich habe eine Java-Source und ich möchte den
      gesamten Code einer Methode mir einer RegEx extrahieren, sprich
      alles zwichen "{" und "}".

      Klammerstrukturen lassen sich mit regulären Ausdrücken nicht dar-
      stellen. Hast du noch nie ein Buch über theoretische Informatik bzw.
      formale Sprachen gelesen? ;))

      bye, Frank!

      1. Joho,

        Klammerstrukturen lassen sich mit regulären Ausdrücken nicht dar-
        stellen. Hast du noch nie ein Buch über theoretische Informatik bzw.
        formale Sprachen gelesen? ;))

        Das hab ich ja auch nicht gesagt. Ich habe gesagt, mit RegExen lassen
        sich nur begrenzt Tiefe Strukturen nachbilden. Du musst nicht so aus
        dem Zusammenhang zitieren ;-)

        Gruss,
         CK

        1. hi!

          Das hab ich ja auch nicht gesagt. Ich habe gesagt, mit RegExen
          lassen sich nur begrenzt Tiefe Strukturen nachbilden. Du musst
          nicht so aus dem Zusammenhang zitieren ;-)

          Ja, ich wollte auch eigentlich gar nicht auf dein Posting antworten,
          sondern auf das darüber... ;)

          bye, Frank!

  2. Hi,

    das Problem das ich hab ist eigentlich gar keins...
    Wohl mehr eine Frage der Eleganz...

    Mal angenommen ich habe eine Java-Source und ich möchte den gesamten Code einer Methode mir einer RegEx extrahieren, sprich alles zwichen "{" und "}".

    probier mal das hier:

    $str = "asdf {otto rolf erwin} qwertz";

    $str =~ /{(.*?)}/;
    print "$1\n";

    gruß, Rolf

    1. Joho,

      probier mal das hier:

      $str = "asdf {otto rolf erwin} qwertz";

      $str =~ /{(.*?)}/;
      print "$1\n";

      Das war ein Schnellschuss ;-) Das Problem ist folgendes:

      public int methodenname(void)
       {
         if(bed)
          {
           if(bed)
            {
            }
          }
         else
          {
           if(bed)
            {
             if(bed)
              {
              }
            }
          }
       }

      Gruss,
       CK

    2. Hi

      probier mal das hier:

      $str = "asdf {otto rolf erwin} qwertz";

      Noe du hast

      $str = " asdf() {otto {rolf {erwin}}} qwertz";

      und er will den Inhalt von adsf() greppen!

      $str =~ /{(.*?)}/;
      print "$1\n";

      Seufz! Aufgabenstellung verfehlt, setzen Rost! *g*

      Tschoe Rolf