Regular Expression für verschachtelte Klammern

Regular Expression für verschachtelte Klammern

am 30.03.2006 13:21:40 von Bernd Muent

Hallo zusammen,
grüble gerade an einem RegEx und komme nicht weiter.

Gegeben zB.
Irgend ein Text {\cs6 aaa {\f4 bbb {i45 ccc} \f5 ddd}} geht hier weiter.

Ich möchte alles rausschmeissen, von der ersten öffenden geschweiften
Klammer bis zu der dazu passenden schliessenden schweifenden Klammer.

s/{.*?}//g

tut es ja wohl nicht. Da bleibt übrig:
Irgend ein Text \f5 ddd}} geht hier weiter.

Danke für Tips, wie man das mit dem "Die-richtige-Klammer-finden"
einbaut, Bernd


--
BM Computer-Services, Bergmannstr. 66, 10961 Berlin
Webdesign, Internet, Layout und Grafik
Tel.: 030/20649400, mobil 0175/7419517, Fax: 030/20649401
Web: http://www.bmservices.de, eMail: kontakt@bmservices.de

Re: Regular Expression für verschachtelte Klammern

am 30.03.2006 13:28:45 von Frank Seitz

Bernd Muent wrote:

> grüble gerade an einem RegEx und komme nicht weiter.
>
> Gegeben zB.
> Irgend ein Text {\cs6 aaa {\f4 bbb {i45 ccc} \f5 ddd}} geht hier weiter.
>
> Ich möchte alles rausschmeissen, von der ersten öffenden geschweiften
> Klammer bis zu der dazu passenden schliessenden schweifenden Klammer.

Ist die zur ersten öffnenden geschweiften Klammer passende
Klammer nicht automatisch die letzte geschweifte Klammer?

> s/{.*?}//g
>
> tut es ja wohl nicht. Da bleibt übrig:
> Irgend ein Text \f5 ddd}} geht hier weiter.
>
> Danke für Tips, wie man das mit dem "Die-richtige-Klammer-finden"
> einbaut, Bernd

Gemäß obigem Gedanken:

s/\{.*\}//gs;

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: Regular Expression für verschachtelte Klammern

am 30.03.2006 13:50:27 von Bernd Muent

Frank Seitz schrieb:

>> Irgend ein Text {\cs6 aaa {\f4 bbb {i45 ccc} \f5 ddd}} geht hier weiter.

> Ist die zur ersten öffnenden geschweiften Klammer passende
> Klammer nicht automatisch die letzte geschweifte Klammer?

Leider nein. Solche Konstrukte könnte auch mehrfach im einer Zeile
vorkommen.

> Gemäß obigem Gedanken:
>
> s/\{.*\}//gs;

Ja, daran hatte ich natürlich auch schon gedacht. Aber das schmeisst
auch den Text zwischen den Mehrfachkonstrukten raus :-(

B.

--
BM Computer-Services, Bergmannstr. 66, 10961 Berlin
Webdesign, Internet, Layout und Grafik
Tel.: 030/20649400, mobil 0175/7419517, Fax: 030/20649401
Web: http://www.bmservices.de, eMail: kontakt@bmservices.de

Re: Regular Expression für verschachtelte Klammern

am 30.03.2006 13:57:25 von Bernd Muent

Bernd Muent schrieb:

> Ja, daran hatte ich natürlich auch schon gedacht. Aber das schmeisst
> auch den Text zwischen den Mehrfachkonstrukten raus :-(

Habe jetzt gerade eine händische Lösung gebaut, die einfach zeichenweise
rüberkopiert in einen temporären String, solange die Klammerebene=0,
sonst eben nichts kopiert.
Aber das dürfte bei Riesendateien - und meine sind 30-60 MB gross,
ziemlich performancefressend sein. Es _muss_ doch nen schönen RegEx
geben oder etwa nicht :-(?

Gruß, Bernd

--
BM Computer-Services, Bergmannstr. 66, 10961 Berlin
Webdesign, Internet, Layout und Grafik
Tel.: 030/20649400, mobil 0175/7419517, Fax: 030/20649401
Web: http://www.bmservices.de, eMail: kontakt@bmservices.de

Re: Regular Expression für verschachtelte Klammern

am 30.03.2006 13:57:32 von Arne Ruhnau

Frank Seitz wrote:
> Bernd Muent wrote:
>
>
>>grüble gerade an einem RegEx und komme nicht weiter.
>>
>>Gegeben zB.
>>Irgend ein Text {\cs6 aaa {\f4 bbb {i45 ccc} \f5 ddd}} geht hier weiter.
>>
>>Ich möchte alles rausschmeissen, von der ersten öffenden geschweiften
>>Klammer bis zu der dazu passenden schliessenden schweifenden Klammer.
>
>
> Ist die zur ersten öffnenden geschweiften Klammer passende
> Klammer nicht automatisch die letzte geschweifte Klammer?

Nein, bei

{tudelu tadela} tamtaramtamtam {tada}

würde tamtaramtamtam komplett unter den Tisch fallen.
Zum Problem: Balancierte Ausdrücke können nicht mit regulären Sprachen
erfasst werden, da sie äquivalent zu Sprachen der Form a^nb^n sind,
und die nur per

S -> /leeres Wort/
S -> a S B

erfasst werden können - und das ist eine kontextfreie Sprache. Da man
aber in Perls regulären Ausdrücken auch Perlcode ausführen kann sollte
es möglich sein, während dem Pattern-matching Klammern zu zählen um so
zu wissen wann man die passende schließende Klammer gefunden hat. Ich
selber bin da zwar gerade nicht so flüssig drin, glaube aber, dass in
Higher Order Perl in einer Fußnote sogar so ein Ausdruck steht...

Unter Umständen, wenn garantiert werden kann, dass die Klammern immer
balanciert sind und dass pro Zeile nur ein geklammerter Ausdruck
kommt, kann allerdings doch die letzte schließende als passende
schließende genommen werden.

hth,

Arne Ruhnau

Re: Regular Expression für verschachtelte Klammern

am 30.03.2006 14:02:12 von Frank Seitz

Bernd Muent wrote:
> Frank Seitz schrieb:

>>>Irgend ein Text {\cs6 aaa {\f4 bbb {i45 ccc} \f5 ddd}} geht hier weiter.
>>
>>Ist die zur ersten öffnenden geschweiften Klammer passende
>>Klammer nicht automatisch die letzte geschweifte Klammer?
>
> Leider nein. Solche Konstrukte könnte auch mehrfach im einer Zeile
> vorkommen.

Dann wähle Dein Beispiel das nächste Mal besser.

>>Gemäß obigem Gedanken:
>>
>>s/\{.*\}//gs;
>
> Ja, daran hatte ich natürlich auch schon gedacht. Aber das schmeisst
> auch den Text zwischen den Mehrfachkonstrukten raus :-(

Versuchs mal damit:

1 while s/\{[^{}]*\}//;

(nicht ernsthaft getestet)

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: Regular Expression fürverschachtelte Klammern

am 30.03.2006 14:37:31 von Daniel Tiefnig

Bernd Muent wrote:
> Ich möchte alles rausschmeissen, von der ersten öffenden
> geschweiften Klammer bis zu der dazu passenden schliessenden
> schweifenden Klammer.

Das ist eine FAQ.
perldoc perlfaq6
-> Can I use Perl regular expressions to match balanced text?


lg,
daniel

Re: Regular Expression fürverschachtelte Klammern

am 30.03.2006 15:48:41 von Lukas Mai

Arne Ruhnau schrob:

[verschachtelte Klammern]

> Zum Problem: Balancierte Ausdrücke können nicht mit regulären Sprachen
> erfasst werden, da sie äquivalent zu Sprachen der Form a^nb^n sind,
> und die nur per
>
> S -> /leeres Wort/
> S -> a S B
>
> erfasst werden können - und das ist eine kontextfreie Sprache. Da man
> aber in Perls regulären Ausdrücken auch Perlcode ausführen kann sollte
> es möglich sein, während dem Pattern-matching Klammern zu zählen um so
> zu wissen wann man die passende schließende Klammer gefunden hat. Ich
> selber bin da zwar gerade nicht so flüssig drin, glaube aber, dass in
> Higher Order Perl in einer Fußnote sogar so ein Ausdruck steht...

Das geht sogar etwas direkter:

$brace_group = qr/ \{ (?: [^{}] | (??{$brace_group}) )* \} /x;

In echtem Code würde ich das aber nicht benutzen, da (??{}) immer noch
"experimental" (= broken) ist (z.B. hat es Probleme mit lexikalischen
Variablen).

Aber zumindest theoretisch sind Perls "reguläre" Ausdrücke mächtig
genug, um Rekursion direkt umsetzen zu können.

Lukas

Re: Regular Expression für verschachtelte Klammern

am 04.04.2006 09:41:48 von ReneeB

Vielleicht hilft auch das Modul Text::Balanced weiter...

Re: Regular Expression fürverschachtelte Klammern

am 06.04.2006 00:26:11 von Oliver Block

Bernd Muent wrote:

> Hallo zusammen,
> grüble gerade an einem RegEx und komme nicht weiter.
>
> Gegeben zB.
> Irgend ein Text {\cs6 aaa {\f4 bbb {i45 ccc} \f5 ddd}} geht hier weiter.
>
> Ich möchte alles rausschmeissen, von der ersten öffenden geschweiften
> Klammer bis zu der dazu passenden schliessenden schweifenden Klammer.
>
> s/{.*?}//g
>
> tut es ja wohl nicht. Da bleibt übrig:
> Irgend ein Text \f5 ddd}} geht hier weiter.
>
> Danke für Tips, wie man das mit dem "Die-richtige-Klammer-finden"
> einbaut, Bernd

Es wird immer der größe Treffer genommen.

s/\{.*\}//

Das funktioniert nur, wenn zu _nur_einen_ solcher verschachtelter Ausdrücke
in einer Zeile hast!

Falls Du zwei hast, wird auch der Text, der zwischen den Klammerpaaren steht
entfernt.

{ ... {...}} Zwischentext { ... {...} ...}

Daher ist der g-Modifizierer hier überflüssig.

Gruss,

Oliver

Re: Regular Expression fürverschachtelte Klammern

am 06.04.2006 00:47:10 von Oliver Block

> Bernd Muent schrieb:

> Aber das dürfte bei Riesendateien - und meine sind 30-60 MB gross,
> ziemlich performancefressend sein. Es _muss_ doch nen schönen RegEx
> geben oder etwa nicht :-(?
>
> Gruß, Bernd
>

{\cs6 aaa {\f4 bbb {i45 ccc} \f5 ddd}}

Falls es immer drei solcher Verschachtelungen sind und immer die
schließenden Klammern nach den öffnenden kommen:

s/\{[^\{]*\{[^\{]*\{[^\}]*\}[^\}]*[^\}]*\}//g

Dieses Mal mit g.

Gruss,

Oliver