Perl regex Hilfe

Perl regex Hilfe

am 21.06.2006 11:16:12 von Stefan Bielenberg

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

Re: Perl regex Hilfe

am 21.06.2006 11:43:46 von Christian Winter

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

Re: Perl regex Hilfe

am 21.06.2006 11:51:23 von Helmut Wollmersdorfer

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

Re: Perl regex Hilfe

am 21.06.2006 12:02:40 von Stefan Bielenberg

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

Re: Perl regex Hilfe

am 21.06.2006 13:49:28 von Daniel Fischer

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