Perl RegEx



  • Hi,
    wie kann ich in Perl mit regulären Ausdrücken aus einem String alle Konstanten (Großbuchstbane und unterstriche) entfernen?

    s/ [A-Z_]* / /g; funktioniert nicht...

    Mfg



  • Moin,

    zeig mal den gesamten Befehl, den du verwendest.

    EDIT:
    Egal; das hier funktioniert auf der Konsole:

    perl -e'my $foo="bArOmEtEr"; $foo =~ s/[A-Z]//g; print "$foo\n";'
    

    MfG



  • Danke erstmal

    Ich hab jetzt ein wenig rumprobiert und bin zu folgendem Ergebnis gekommen:

    1. Dein Beispiel lief bei mir nicht in der KOnsole(aber in der Datei, was ich auch brauche^^)

    my $foo="Eine KON_STANTE und Text.";
    $foo =~ s/ [A-Z_]* / /g;
    print "$foo\n";
    

    funktioniert genau so wie es soll, also

    Eine und Text."
    

    3. jedoch

    my $foo="Eine  KON_STANTE und Text.";
    $foo =~ s/ [A-Z_]* / /g;
    print "$foo\n";
    

    (zwei Leerzeichen vor KON_STANTE)
    funkktioniert NICHT.
    Gleiches passiert leider auch wenn ich nach Zahlen suche. Sobald 2 Leerzeichen davorstehen geht nix mehr.

    Achja, vorher alle Leerzeichen, bis auf eins zu eliminieren wäre bei meiner Anwendung völlig inakzeptabel.

    PS. (is mein Thread, auch wenn ich mich nicht eingeloggt habe, wegen Arbeit)



  • warum die Leerzeichen in der Regex? Und der Klenee-Star ist vollkommen hinderlich, weil du sowieso das g-Flag setzt. Folgendes Funktioniert bie mir einwandfrei:

    my $foo="Eine  KON_STANTE und Text.";
    $foo =~ s/[A-Z_]//g;
    print "$foo\n";
    


  • EDIT: mit + anstat * geht es. Trotzdem danke

    das war wohl etwas zweideutig geschrieben(hatte leider nicht viel Zeit)

    Es sollen alle "Wörter" entfernt werden, die nur aus Großbuchstaben und Unterstrichen bestehen. Alle Großbuchstaben, die z.b. am Wortanfang stehen wegen Satzbeginn oder Nomen, sollen da bleiben:

    "KON_STA_TE"    weg
    "KONSTANTE"    weg
    "_K"    weg
    "Ein Text" soll alles bleiben
    "Ein langer Text mit MEHREREN KON_STANTEN soll OH__NE Konstanten werden." soll zu
    "Ein langer Text mit soll Konstanten werden." werden
    

    Der Stern, damit Wörter mit mehr als einem Zeichen entfernt werden und die Leerzeichen, damit nur ganze Wörter ausgefiltert werden.
    Leider fukntioniert es nicht mehr, wenn sich Leerzeichen häufen

    "Ein langer Text mit   MEHREREN  KON_STANTEN soll       OH__NE Konstanten werden."
    

    Dann scheint RegEx die nicht mehr zu finden.

    (Die vielen Leerzeichen entstehen durch vorrangehende RegEx(die sich nicht anders lösen lassen) und jedesmal ein s/ / /g; drüberlaufen zu lassen wöäre bei hundertausenden von Wörtern und dutzenden von RegEx pro Wort seeehr langsam^^



  • Hmm, so ganz war das auch nix. Ich hab irgendwo anders das Problem "behoben".

    Ich habe jetzt die Vermutung, dass es ein Problem gibt, wenn ich hier:

    Eine KON STAN te
    

    den RegEx

    s/ [A-Z]+ / /g;
    

    drüberlaufen lasse, wird das
    KON durch ein Leerzeichen ersetzt.
    Danach wird anscheinend der "Suchpointer" nach das neu eingefügte Leerzeichen gesetzt, sodass " STAN " dann nicht mehr gefunden wird. <-- Nur Vermutung

    Meine Suche hat ergeben, dass s:ov/ das Problem beheben könnte. Anscheindend läuft das aber nicht unter Perl 5, sondern nur Perl 6.

    Vllt kann mir jetzt jemand helfen?


Anmelden zum Antworten