RegEx für geschachtelte Klammern?
Slob
- perl
0 Christian Kruse0 LanX0 Slob0 Frank Schönmann
0 Rolf0 Christian Kruse0 LanX
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
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
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
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
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
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
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
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!
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
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!
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
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
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