Schrift
[thread]13100[/thread]

Rekursion mit regulärem Ausdruck



<< >> 6 Einträge, 1 Seite
Gast Gast
 2009-02-04 10:36
#118636 #118636
Hallo,
ich versuche einen bestimmten regulären Ausdruck zu implementieren, habe es bis jetzt jedoch leider nicht geschafft, und hoffe dass mir jmd hier helfen kann:

Ein eingelesener String kann beliebige Zeichen enthalten, und soll ausgeschnitten werden bis die erste Klammer schließt, welche nicht geöffnet wurde
Bevor diese Klammer welche nicht geöffnet wurde, geschlossen wird, können allerdings auch weitere eingeklammerte Texte stehen (welche dann auch wiederum Klammerausdrücke enthalten könnten), es müssen jedoch keine geklammerten Ausdrücke vorkommen.
Nach der Klammer, welche schließt ohne geöffnet werden zu sein, können noch weitere Klammerausdrücke (auch nur schließende Klammern) im String vorkommen, diese sollen jedoch nicht erfasst werden.

um da dass ganze jetzt ein bißchen verworren geschrieben ist, hier ein paar beispiele, um das ganze zu verdeutlichen:

aus String: "gewollt) nicht_gewollt )"
soll die Ausgabe sein: "gewollt)"

aus String: "(ja) ja (ja) ja) nee (nee) )"
soll die Ausgabe sein: "(ja) ja (ja) ja)"

oder schwerer:
aus String: "((j > (j)0) ? j : -j)) * nn"
soll die Ausgabe sein: "((j > (j)0) ? j : -j))"

Soweit mir das ersichtlich ist, lässt sich das Problem nur mit Rekursion elegant lösen. -- die Frage ist nur, WIE? =)

Ich bin für jede hilfe wirklich sehr dankbar.
gruß jaf
renee
 2009-02-04 10:49
#118638 #118638
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Schau Dir mal das Modul CPAN:Text::Balanced an. Das könnte Dir evtl. weiterhelfen
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Gast Gast
 2009-02-04 11:29
#118639 #118639
Danke für die schnelle Antwort.
Ich gebe dir recht, dass mir dieses Modul evtl. weiterhelfen könnte.
Als relativer Pearl-Neuling, weiss ich jedoch immer noch nicht, wie ich das ganze umsetzen soll.
Bin also leider auf weitere Hilfe (sehr gerne auch Codebeispiele) angewiesen
Gast Gast
 2009-02-04 12:39
#118645 #118645
Hi nochmal,

ich glaube das Problem gelöst zu haben und möchte euch meinen Ansatz mitteilen (falls es jmdn interessiert oder jmd mal ein ähnliches problem hat)

Ich lasse im String nach möglichst vielen Zeichen suchen, bis die letzte schließende Klammer kommt.
Jetzt der Kniff: ich füge meinem String am Anfang noch eine öffnende Klammer bei

Code: (dl )
my $input = "(".$1;


mit Hilfe von "extract_bracketed" von Balanced.pm (VIELEN DANK RENEE!!) schaffe ich es dann, das beginnend von der manuell hinzugefügten öffnenden Klammer alles ausgeschnitten wird, bis zu der Klammer, die ohne die manuell hinzugefügte Klammer die erste schließende Klammer wäre, die nie geöffnet wurde (voll verwirrend, aber klar? *g*)

Code: (dl )
1
2
my @cutout = Text::Balanced::extract_bracketed( $input, '()' );
$input = $cutout[0];


Da mich nur der Ausdruck bis zur ersten schließenden Klammer interessiert, entferne ich jetzt die letzte Klammer, ebenso wie die manuell hinzugefügte

Code (perl): (dl )
$input =~ s/\((.*)\)/$1/x;


und habe somit was ich wollte.

Keine Ahnung ob das besonders elegant oder "perlig" ist, aber es funktioniert.
Falls ihr Verbesserungsvorschläge habt oder meint man könnte es anders eleganter machen, können wir von mir aus noch gerne weiterdiskutieren/-philosophieren, aber mein Problem ist erstmal gelöst.

nochmals danke Renee, ohne den Hinweis hätt ichs nicht geschafft
gruß jaf
pq
 2009-02-04 12:57
#118646 #118646
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Gast+2009-02-04 10:29:55--
Als relativer Pearl-Neuling, [...]

ein guter start ist immer, den namen der programmiersprache richtig schreiben zu können.
"Perl"
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
murphy
 2009-02-04 16:42
#118649 #118649
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Gast+2009-02-04 11:39:28--
[...]
Code (perl): (dl )
$input =~ s/\((.*)\)/$1/x;

[...]


Hier wuerde ich eher substr benutzen, oder den regulaeren Ausdruck verankern -- das erscheint mit sauberer und vielleicht ist es auch ein wenig schneller:
Code (perl): (dl )
$input = substr($input, 1, length($input) - 2);

oder
Code (perl): (dl )
$input =~ s/^\((.*)\)\z/$1/;


Ansonsten finde ich die Loesung kreativ und gut :-)
When C++ is your hammer, every problem looks like your thumb.
<< >> 6 Einträge, 1 Seite



View all threads created 2009-02-04 10:36.