Perl regex Hilfe

Hallo,

ich suche eine Perl-regex die in einem String Klammern erkennen kann und
zwar so:

Erkenne Formeln, die geschachtelte Klammern besitzen, aber nicht
Formeln, die nicht geschachtelte Klammern haben:

geschachtelt: C(H2(CO2)H2) oder C((CO2)H2)

nicht geschachtelt: C(CO2)Cl(H2)

Folgende Lösung hätte ich schon für das Erkennen von C((CO2)H2), also
von zusammenliegenden, geschachtelte Klammern:

elsif ( ( $formula =~ /\({2,}/ ) or ( $formula =~ /\){2,}/ ) ) {
return 'not allowed 2 (( or 2 )) together';
}

Aber wie sieht es aus, wenn die Klammern nicht zusammenliegen, z.B. bei
dieser Formel C(H2(CO2)H2). Mit folgender regex erkennt er leider auch
gute Formeln, die zwar Klammern aber keine verschachtelten Klammern
besitzen, wie z.B. C(CO2)Cl(H2)

elsif ( ( $formula =~ /\(.*\(/ ) or ( $formula =~ /\).*\)/ ) ) {
return 'no allowed parenthesis inside parenthesis';
}


Wer kann helfen? Ich bin damit leider ein bisschen überfordert... :-(

Stefan
Stefan Bielenberg [ Mi, 21 Juni 2006 11:16 ] [ ID #1365116 ]

Re: Perl regex Hilfe

Stefan Bielenberg schrieb:
> Hallo,
>
> ich suche eine Perl-regex die in einem String Klammern erkennen kann und
> zwar so:
>
> Erkenne Formeln, die geschachtelte Klammern besitzen, aber nicht
> Formeln, die nicht geschachtelte Klammern haben:
>
> geschachtelt: C(H2(CO2)H2) oder C((CO2)H2)
>
> nicht geschachtelt: C(CO2)Cl(H2)
>
> Folgende Lösung hätte ich schon für das Erkennen von C((CO2)H2), also
> von zusammenliegenden, geschachtelte Klammern:
>
> elsif ( ( $formula =~ /\({2,}/ ) or ( $formula =~ /\){2,}/ ) ) {
> return 'not allowed 2 (( or 2 )) together';
> }
>
> Aber wie sieht es aus, wenn die Klammern nicht zusammenliegen, z.B. bei
> dieser Formel C(H2(CO2)H2). Mit folgender regex erkennt er leider auch
> gute Formeln, die zwar Klammern aber keine verschachtelten Klammern
> besitzen, wie z.B. C(CO2)Cl(H2)
>
> elsif ( ( $formula =~ /\(.*\(/ ) or ( $formula =~ /\).*\)/ ) ) {
> return 'no allowed parenthesis inside parenthesis';
> }

Wenn die Klammern nicht zusammenliegen, sollte die Bedingung lauten:
Suche nach öffnender Klammer, gefolgt von mindestens einem anderen
Zeichen, wobei keines eine schließende Klammer ist, gefolgt von
einer weiteren öffnenden Klammer. Also etwas wie

if( $formula =~ / \( [^)]+ \( /x ) { ... }
bzw.
if( $formula =~ / \( [^)]* \( /x ) { ... }
falls auch zusammenliegende öffnende Klammern erkannt werden sollen.

HTH
-Christian
Christian Winter [ Mi, 21 Juni 2006 11:43 ] [ ID #1365117 ]

Re: Perl regex Hilfe

Stefan Bielenberg wrote:

> Aber wie sieht es aus, wenn die Klammern nicht zusammenliegen, z.B. bei
> dieser Formel C(H2(CO2)H2). Mit folgender regex erkennt er leider auch
> gute Formeln, die zwar Klammern aber keine verschachtelten Klammern
> besitzen, wie z.B. C(CO2)Cl(H2)

> elsif ( ( $formula =~ /\(.*\(/ ) or ( $formula =~ /\).*\)/ ) ) {
> return 'no allowed parenthesis inside parenthesis';
> }

'.*' steht für 'beliebiges Zeichen in beliebiger Anzahl'.
Stattdessen solltest Du eine Character-Class ohne ')' bzw. '(' verwenden.

Das schaut dann so aus:
elsif ( ( $formula =~ /\([^)]*\(/ ) or ( $formula =~ /\)[^(]*\)/ ) ) { ... }

Helmut Wollmersdorfer
Helmut Wollmersdorfer [ Mi, 21 Juni 2006 11:51 ] [ ID #1365118 ]

Re: Perl regex Hilfe

Helmut Wollmersdorfer schrieb:
> '.*' steht für 'beliebiges Zeichen in beliebiger Anzahl'.
> Stattdessen solltest Du eine Character-Class ohne ')' bzw. '(' verwenden.
>
> Das schaut dann so aus:
> elsif ( ( $formula =~ /\([^)]*\(/ ) or ( $formula =~ /\)[^(]*\)/ ) ) {
> ... }

Das ist die Lösung! Danke für Eure Antworten!

Grüße,
Stefan
Stefan Bielenberg [ Mi, 21 Juni 2006 12:02 ] [ ID #1365119 ]

Re: Perl regex Hilfe

Stefan Bielenberg!

> Erkenne Formeln, die geschachtelte Klammern besitzen, aber nicht
> Formeln, die nicht geschachtelte Klammern haben:

Dein Problem ist zwar einfacher, aber in perldoc perlre gibt es ein
Beispiel, wie man mit rekursiven RE Ausdruecke mit geschachtelten Klammern
erkennen kann.


Gruss
Daniel
Daniel Fischer [ Mi, 21 Juni 2006 13:49 ] [ ID #1365120 ]
Perl » de.comp.lang.perl.misc » Perl regex Hilfe

Vorheriges Thema: Sub mit Schleife wird nicht richtig beendet
Nächstes Thema: Re: dateiuebergreifend ersetzen mit Wildcards?