Rafael: Hilfe bei RegEx

Eigentlich sollte das nicht so schwer sein, aber ich komm nicht drauf. Ich möchte eine beliebige Buchstabenfolge [a-zA-Z]+ selektieren aber nicht XYZ oder ABC.

Egal wie ichs stelle, ich bekomm immer beide oder gar nichts....

Danke für den nächtlichen Beistand.

  1. Hi!

    Egal wie ichs stelle, ich bekomm immer beide oder gar nichts....

    Wie sehen deine Versuche denn aus?

    Ich möchte eine beliebige Buchstabenfolge [a-zA-Z]+ selektieren aber nicht XYZ oder ABC.

    Also für "eine beliebige Buchstabenfolge" kannst du eine Klasse verwenden.
    In deinem Fall wäre das [:alpha:].
    Und wenn du etwas negieren willst, dann nimmst du dafür das Zeichen "^".

    Schau mal in der Wikipedia den Artikel über reguläre Ausdrücke an.

    Und als guter Tipp zum Entwickeln von regulären Ausdrücken:
    Schau dir das kostenlose Programm The RegEx Coach an.
    Damit kannst du deinen RegEx erstellen und auch direkt testen.
    Du kannst damit sozusagen interaktiv arbeiten.
    Das Programm übersetzt dir deinen RegEx auch in "normale Sprache" oder zeigt in dir in Baumstruktur.
    Das Ding ist ein unglaublich nützliches Tool, gerade wenn die RegEx komplexer werden, kann man so recht einfach die Übersicht behalten.
    Ein Tutorial gibt es auch dazu.

    Schöner Gruß,
    rob

    1. Ich kenne den Regex-Coach schon, trotzdem danke.
      Aber mein Problem ist ein Verständnisproblem bei der Definition.

      Ich habe folgenden String und möchte diese Begriffe finden und per RegEx umformen. Nur Key soll Key bleiben

      XY.Bla, Hallo, a.Test, Key

      Das ist nach meinem verständnis richtig, aber scheinbar ist es das nicht.

      ([a-zA-Z]+.)?[(^(Key))a-zA-Z]+

      Das hilft mir der RegEx Coach auch nicht weiter...

      1. Hi,

        Ich habe folgenden String und möchte diese Begriffe finden und per RegEx umformen. Nur Key soll Key bleiben

        Ich hoffe folgendes Beispiel hilft dir weiter:

          
        #!/usr/bin/perl -w  
          
        use strict;  
          
          
        my $string = 'EAEABCOPI';  
          
        my $key = 'ABC';  
          
          
        # sucht nach beliebigen Buchstaben gefolgt vom Inhalt von $key  
        # wobei der Ausdruck in der Klammer mit ?= nichtmehr zum Ergebnis gehoert  
        if ( $string =~ /([a-zA-Z]+(?=$key))/ )  
        {  
            print "\nTreffer: $1\n";  
        }  
        else  
        {  
            print "\nkein Treffer\n";  
        }  
          
          
        # alles vor $key mit nichts ersetzen  
        $string =~ s/([a-zA-Z]+)(?=$key)//;  
          
        print "\nString danach: $string\n";  
          
          
        
        

        mfG,
        steckl

      2. gudn tach!

        Ich habe folgenden String und möchte diese Begriffe finden und per RegEx umformen. Nur Key soll Key bleiben

        XY.Bla, Hallo, a.Test, Key

        Das ist nach meinem verständnis richtig, aber scheinbar ist es das nicht.

        ([a-zA-Z]+.)?[(^(Key))a-zA-Z]+

        ([a-zA-Z]+.)  heisst "mind. ein buchstabe, gefolgt von einem punkt"
        ?              oder nicht.

        [              leitet eine zeichenklasse ein.
        (^(Key))a-zA-Z ist dasselbe wie
        ()^a-zA-Z      , weil nur eine _zeichen_klassen-definition erfolgt.

        [()^a-zA-Z]+   matcht also auf einen string, der nur aus genannten zeichen besteht und mind. ein zeichen lang ist.

        das ganze ist also fern von dem, was du eigentlich willst.

        wenn du alle worte ersetzen willst, die nicht "Key" sind, dann kannst du es mal mit (perl-syntax)

        s/\b(?!Key)[a-zA-Z]+\b/foo/g;

        probieren. "\b" matcht wortgrenzen. (?!Key) ist eine zero-width negative look-ahead assertion (siehe perldoc perlre).

        aus
          XY.Bla, Hallo, a.Test, Key
        wuerde damit
          foo.foo, foo, foo.foo, Key

        allerdings wuerde z.b. KeyXY auch nicht ersetzt werden. sollte auch dies ersetzt werden, so wuerde ein weiterer einsatz von "\b" das erreichen:
          s/\b(?!Key\b)[a-zA-Z]+\b/foo/g;

        ach so.
        s/foo/bar/g in perl ist in php ungefaehr preg_replace('/foo/g', 'bar').

        prost
        seth

        1. Hallo,
          danke für deine Hilfe und vor allem den Link. Gerade letzterer hat mich mit regulären Ausdrücken sehr viel weiter gebracht.
          Trotzdem stehe ich noch vor einem (hoffentlich kleinen) Rätsel.

          Und zwar wird bei mir (php: preg_replace) aus

          RegEx: /(A.)??(?!Key1)(?!Key2)([\w\-]+)?/i
          Replace : A.$2

          -> A.Test, Key1
          zu: A.Test, KA.ey1

          Versteht mich nicht falsch, ich möchte es auf keinen Fall vorgekaut bekommen. Ich vermute selbst auch bereits, dass es mit PHP zu tun hat, denn der RegEx Coach gibt mir das ganze beispielsweise korrekt wieder.

          Deshalb denke ich, dass sich das ?! in meinem Fall nur auf den ersten Buchstaben bezieht, was ich aber ärgerlicherweise nicht verhindern kann...

          Danke an alle Helfenden. Die bisherigen und die künftigen.

          1. gudn tach!

            Und zwar wird bei mir (php: preg_replace) aus

            RegEx: /(A.)??(?!Key1)(?!Key2)([\w\-]+)?/i
            Replace : A.$2

            -> A.Test, Key1
            zu: A.Test, KA.ey1

            weil du die wortbegrenzung \b nicht verwendest.
            "ey1" ist ja nicht "Key1".

            was hast du eigentlich genau vor? willst du die backticks hinzufuegen, wo sie fehlen?

            prost
            seth