Kackfohgel.: Reguläre Ausdrücke

Hallo,

ich habe in einem Programm die Möglichkeit mit regulären Ausdrücken (PERL) bestimmte Datensätze auszufiltern. Ich kann programmbedingt ausschließlich diese regulären Ausdrücke verwenden, weitere Bedingungen sind nicht möglich.

Nun zu meinem Problem, ich habe bspw. folgende Daten:

"Alle Daten", "n.v.", "123.40", "123.45.6", "123.50", "987.50" "987.6.40", 123.456.789.0"

Zunächst war die Anforderung, alle Daten zu liefern, die Ziffern enthalten. Mit [0-9] konnte ich diese Hürde noch gut alleine meistern.

Nun ist eine Anforderung, zusätzlich die Strings auszufiltern (also nicht! zurückzuliefern), die ein ".50" enthalten. Da ich programmbedingt nur reguläre Ausdrücke verwenden kann und keine weiteren Bedingungen einfügen kann, bleibt mir wohl nur eine Positivbeschreibung. Hiermit klappt es:

.1|.2|.3|.4|.6|.7|.8|.9|.0

Abgesehen davon, dass ich das jetzt schon relativ umständlich finde, würden derzeit ja auch alle ".5" ausgefiltert, was bei den derzeitigen Daten noch unproblematisch ist, da nicht vorhanden, aber zukünftig nicht auszuschließen ist. Also müsste ich das schon wie folgt erweitern (noch nicht getestet):

.1|.2|.3|.4|.51|.52|.53|.54|.55|.56|.57|.58|.59|.6|.7|.8.9|.0

Weiß jemand eine bessere/kürzere Lösung? Eine Umkehrung/Negation ist ohne weitere Bedingung nicht möglich oder? Also sowas wie ! für ungleich ala "!.50"?

Freundliche Grüße
Kackfohgel

  1. Hallo,

    Eine Umkehrung/Negation ist ohne weitere Bedingung nicht möglich oder?

    siehe <http://de.selfhtml.org/perl/sprache/regexpr.htm#zeichen@title=letzten Absatz>

    Gruß
    Kalk

    1. Hallo Kalk,

      vielen Dank für deine Antwort.

      Eine Umkehrung/Negation ist ohne weitere Bedingung nicht möglich oder?

      siehe <http://de.selfhtml.org/perl/sprache/regexpr.htm#zeichen@title=letzten Absatz>

      Diesen Artikel habe ich mir vorab durchgelesen und jetzt insbesondere nochmal den von dir verlinkten Teil. Ich finde zwar diesen Satz:

      "Dazu notieren Sie direkt nach der öffnenden eckigen Klammer [  das Hütchensymbol ^."

      Kann ihn aber nicht ohne Weiteres anwenden. Ich bin jetzt wenigstens so weit, dass ich mit

      ".[^5]"

      alle Datensätze mit ".5" ausfiltere. Dann habe ich aber immer noch nicht die Datensätze ohne Zahl [0-9] (z. B. "Alle Daten" und "n.v" ausgefiltert) und ich kriege auch mögliche Daten mit ".51" nicht geliefert.

      Wie man mehr als ein Zeichen negiert, steht dort imho nicht und ich schaffe es auch nicht mir dies herzuleiten.

      Freundliche Grüße
      Kackfohgel

      1. Die SELFHTML-Doku kann man getrost in die Tonne treten. Da stehen ja nicht mal Look-around Assertions drin, erbärmlich.

        1. @@CPAN:

          nuqneH

          Die SELFHTML-Doku kann man getrost in die Tonne treten.

          SELFHTML ist in einer Tonne, 2007-03-01 wurde der Deckel draufgetan.

          Da stehen ja nicht mal Look-around Assertions drin, erbärmlich.

          Gab’s die vor 5 Jahren schon?

          Wie auch immer, das Wiki wird (mehr oder weniger) gepflegt.

          Qapla'

          --
          Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
          (Mark Twain)
          1. Look-around Assertions
            Gab’s die vor 5 Jahren schon?

            Seit Version 3, Oktober 1989. ఠ_ఠ

            Die SELFHTML-Doku kann man getrost in die Tonne treten.
            SELFHTML ist in einer Tonne, 2007-03-01 wurde der Deckel draufgetan.

            Ich wünschte, jede Seite würde das am Anfang auch sagen, so z.B.:

            ⚠ Diese Doku ist veraltet und wird seit 2007
                ⚠ nicht mehr gepflegt. Aktualisierte Informationen
                ⚠ sind möglicherweise im [Wiki] vorhanden.

            [Wiki]

            Das sieht gleich brauchbarer aus. In meiner ÜPPIGEN FREIZEIT müsste ich mal mit einem feinen Kamm drübergehen…

  2. /\d (?<! [.]50 ) \z/amsx

    1. /\d (?<! [.]50 ) \z/amsx

      Liefert mir keinen der v. g. Strings zurück (falls das eine Antwort war und du nicht nur auf der Tastatur eingeschlafen warst ;-))

      1. @@Kackfohgel.:

        nuqneH

        /\d (?<! [.]50 ) \z/amsx
        Liefert mir keinen der v. g. Strings zurück (falls das eine Antwort war und du nicht nur auf der Tastatur eingeschlafen warst ;-))

        In dem Zusammenhang:
        Nerd Joke: How do you generate a random string? Put a first year CS student in front of VIM and tell him to save and exit. [@HarvardAsianGuy]

        Qapla'

        --
        Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
        (Mark Twain)
        1. Nerd Joke: How do you generate a random string? Put a first year CS student in front of VIM and tell him to save and exit.

          Hehe, ich kann ja meine Versuche den gewünschten regulären Ausdruck hinzubekommen mal speichern, falls ich mal wieder ein sicheres Passwort benötige. Dann war die Mühe nicht umsonst.

      2. Dann machst du was falsch. Es ist getestet und funktioniert.

        $ cat daten
        Alle Daten
        n.v.
        123.40
        123.45.6
        123.50
        987.50
        987.6.40
        123.456.789.0
        $ perl -lne'print if /\d (?<! [.]50 ) \z/amsx' < daten
        123.40
        123.45.6
        987.6.40
        123.456.789.0

        1. Schonmal vielen Dank, dass du das getestet hast. Leider klappt es bei mir nicht, weshalb ich das jetzt Schritt für Schritt getestet habe:

          /d

          Funktioniert (mir werden nur die Strings mit Ziffern zurückgeliefert)

          Doch schon beim zero-width negative look-behind, passiert nichts weiter. Das (?<![.]50) bedeutet doch, dass der Ausdruck ".50" den nachfolgenden Ausdruck (hier dem Ende des Strings) nicht vorausgehen darf. Richtig?

          Dies funktioniert aber nicht. Ich bekomme alle Strings mit Ziffern zurückgeliefert (auch die mit ".50")

          Was mache ich noch falsch?

          1. Ich bitte vielmals um Entschuldigung. Ich hatte noch ein überflüssiges Leerzeichen zwischen "!" und "[" ohne dies funktioniert es.

            Vielen Dank an alle, die mir geholfen haben.