HP-User: Reg. Ausdruck oder IF?

Morgen Forum

Ich muss einen Skalar $nick überprüfen, ob folgende Teilstrings allein oder im Verbund enthalten ist. Folgende Kombinationen sollen matchen:

EZ-Team (ohne Leerzeichen Team klein)
EZ-TEAM (ohne Leerzeichen TEAM groß)

EZ- Team (mit Leerzeichen nach dem Minus Team klein)
EZ- TEAM (mit Leerzeichen nach dem Minus TEAM groß)

EZ -Team (mit Leerzeichen vor dem Minus Team klein)
EZ -TEAM (mit Leerzeichen vor dem Minus TEAM groß)

EZ - Team (mit Leerzeichen vor und nach dem Minus Team klein)
EZ - TEAM (mit Leerzeichen vor und nach dem Minus TEAM groß)

Prinzipiell könnte ich alles mit IF-Abfragen angehen:

------------------------------------------------
if ($nick eq "EZ-Team") {Geh zum Fehlerblock;}
------------------------------------------------

Aber wie geht das bei *EZ-Team*? Also wenn vor und -oder hinter dem zu "matchendem" Teil noch was steht?

Das dürfte doch ein Kandidat für die "Würmchencodes"[1] sein:

--------------------------------------------------------------
if ($nick =~ /---was muss da rein?---/ ) {goto FehlerblockXY;}
--------------------------------------------------------------

Ist diese Vielfalt zur Überprüfung machbar?

[1] Weil das liegende "s" hier-> ~ wie ein Würmchen aussieht *g*

Gruss HP-User

  1. Moinsen!

    Der gesuchte reguläre Ausdruck (ungetestet) müsste so aussehen:
    EZ {0,1}- {0,1}(Team|TEAM)

    Alles klar?

    Viele Grüße,
    Norbert

    Morgen Forum

    Ich muss einen Skalar $nick überprüfen, ob folgende Teilstrings allein oder im Verbund enthalten ist. Folgende Kombinationen sollen matchen:

    EZ-Team (ohne Leerzeichen Team klein)
    EZ-TEAM (ohne Leerzeichen TEAM groß)

    EZ- Team (mit Leerzeichen nach dem Minus Team klein)
    EZ- TEAM (mit Leerzeichen nach dem Minus TEAM groß)

    EZ -Team (mit Leerzeichen vor dem Minus Team klein)
    EZ -TEAM (mit Leerzeichen vor dem Minus TEAM groß)

    EZ - Team (mit Leerzeichen vor und nach dem Minus Team klein)
    EZ - TEAM (mit Leerzeichen vor und nach dem Minus TEAM groß)

    Prinzipiell könnte ich alles mit IF-Abfragen angehen:


    if ($nick eq "EZ-Team") {Geh zum Fehlerblock;}

    Aber wie geht das bei *EZ-Team*? Also wenn vor und -oder hinter dem zu "matchendem" Teil noch was steht?

    Das dürfte doch ein Kandidat für die "Würmchencodes"[1] sein:


    if ($nick =~ /---was muss da rein?---/ ) {goto FehlerblockXY;}

    Ist diese Vielfalt zur Überprüfung machbar?

    [1] Weil das liegende "s" hier-> ~ wie ein Würmchen aussieht *g*

    Gruss HP-User

    1. Hi!

      Ich gehe davon aus, dass ez-team, Ez-TeAm, EZ-teaM, ... auch gefunden werden sollen. Es macht ueberhaupt keinen Sinn, jede Schreibweise einzeln zu ueberpruefen. Also lieber lowercase oder uppercase pruefen. Dann reicht z.B. einmal EZ und TEAM.

      --
      Signaturen sind blöd!
    2. gudn tach!

      Der gesuchte reguläre Ausdruck (ungetestet) müsste so aussehen:
      EZ {0,1}- {0,1}(Team|TEAM)

      richtig. wobei ich fuer '{0,1}' die abkuerzung '?' nehmen und grundsaetzlich non-capturing buffers verwenden wuerde, wenn ich nicht backreferences verwenden moechte, also z.b.

      /EZ ?- ?(?:Team|TEAM)/
      oder
        /EZ ?- ?T(?:eam|EAM)/

      prost
      seth

      1. Hi seth_not@home

        Der gesuchte reguläre Ausdruck (ungetestet) müsste so aussehen:
        EZ {0,1}- {0,1}(Team|TEAM)

        richtig. wobei ich fuer '{0,1}' die abkuerzung '?' nehmen und grundsaetzlich non-capturing buffers verwenden wuerde, wenn ich nicht backreferences verwenden moechte, also z.b.

        /EZ ?- ?(?:Team|TEAM)/
        oder
          /EZ ?- ?T(?:eam|EAM)/

        Danke für deine fachmännische Erweiterung. Da aber für mein kleines Hirni die "Regulären Ausdrücke" eh schon viel zu kompliziert sind, belasse ich es dann doch bei der "ausführlichen" Schreibweise *g*

        Nein, ganz ehrlich... ich blick doch schon bei Norberts Code nicht ganz durch. Was glaubst du wieviel ich dann erst von deinem versteh...

        Also laut meiner Recherche sind die slashes  sog. Begrenzer:
        /Filtergedöhns/

        Das "Filtergedöhns ist aber immer der Teil beim Programmieren, der kompliziert ist. Gibt es eine gute Literarische Quelle, auf gut deutsch ein Buch, dass was taugt? Eines, dass die Reg. Expressions "step-by-step" erklärt? Ich gehe mal davon aus, das die meisten Leute die Reg.Ex. wohl wie Vokabeln auswendig lernen - für gängige Problemstellungen eben. Na ja, Ich danke allen für die Hilfe - so als "Wochenendprogrammer" kann man halt nicht alles wissen...

        Viele Grüsse

        HP-User

        1. gudn tach!

          Gibt es eine gute Literarische Quelle, auf gut deutsch ein Buch, dass was taugt? Eines, dass die Reg. Expressions "step-by-step" erklärt?

          da gibt's mehrere. da wir hier ja das selfhtml-forum sind, nenne ich dir mal die selfhtml-doku dazu:
          http://wiki.selfhtml.org/wiki/Doku:Perl/Reguläre_Ausdrücke

          kannst ja mal sagen, ob du das fuer verstaendlich haeltst oder nicht und was dir noch fehlt.

          prost
          seth

          1. Hi Auch

            da gibt's mehrere. da wir hier ja das selfhtml-forum sind, nenne ich dir mal die selfhtml-doku dazu:
            http://wiki.selfhtml.org/wiki/Doku:Perl/Reguläre_Ausdrücke

            Danke für den Link. Die Wiki sieht ja richtig modern und gut aus *freu*
            Na da hat doch wer neu renoviert? Was so ne neue Tapete an der Wand gleich aus macht *lol*

            Wollt mir die Seite Ausdrucken - aber 34 Seiten sind dann doch zuviel. Als Vorschlag: Bietet doch gerade die Tabellen mit der Rex-Ex-Erklärung als Kompakt-Download an. Dann kann man sich die an die Zimmerwand nageln *g*

            Gruss HP-User

    3. Abend Norbert!

      Der gesuchte reguläre Ausdruck (ungetestet) müsste so aussehen:
      EZ {0,1}- {0,1}(Team|TEAM)

      Alles klar?

      Nein, ganz und gar nicht, weil - kompliziert! Das macht aber nichts, denn ich hab das fast so 1:1 übernommen :-D

      So sieht die abgewandelte Version aus:

      if ($nick =~ /(EZ|ez|Ez|eZ) {0,1}- {0,1}(Team|TEAM|team|TeAm|teAm|TEam|TEAm|tEAM|TeAM|TeaM)/) {goto NamenUmfangError;}

      Was soll ich sagen - es läuft, und das ist auch gut so.
      Wer mal probieren will:

      http://www.einschlafzeit.de/eintrag.shtml

      Aber nit zu dolle, weil er (Mr. Server) bereits die Testeingaben speichert. Wird aber eh gelöscht werden, wenn die Lesefunktion dann auch mal fertig wird! Ihr habt richtig gelesen: Momentan kann man was ins Gästebuch schreiben, aber noch nicht lesen. Das mach, ich wenn ich nicht zu müde bin, nachher, oder spätestens morgen... Will mich da jetzt noch nicht festlegen *g*

      Gruss und Dank HP-User

      ***Ihr seid die besten!***

      1. gudn tach!

        Der gesuchte reguläre Ausdruck (ungetestet) müsste so aussehen:
        EZ {0,1}- {0,1}(Team|TEAM)

        Alles klar?

        Nein, ganz und gar nicht, weil - kompliziert!

        ok, der reihe nach:
          EZ {0,1}- {0,1}(Team|TEAM)
          ^
        ein 'E'

        EZ {0,1}- {0,1}(Team|TEAM)
           ^
        dann ein 'Z'

        EZ {0,1}- {0,1}(Team|TEAM)
            ^^^^^^
        dann ein leichzeichen, dass mind. 0 mal und hoechstens 1 mal vorkommen sollen. auf deutsch: ein leerzeichen ' ' oder keins ''.

        EZ {0,1}- {0,1}(Team|TEAM)
                  ^
        ein bindestrich (etwas genauer: der simple bindestrich, den man mit genau einem tastendruck bei einem gewoehnlichen keyboardlayout eingeben kann; es gibt noch andere bindestriche)

        EZ {0,1}- {0,1}(Team|TEAM)
                   ^^^^^^
        wie eben: ein leerzeichen oder keins.

        EZ {0,1}- {0,1}(Team|TEAM)
                         ^^^^^^^^^^^
        eine alternative (durch das pipe-zeichen '|' symbolisiert). die klammern helfen hier nur, um die alternativen einzugrenzen: also entweder 'Team' _oder_ 'TEAM'

        if ($nick =~ /(EZ|ez|Ez|eZ) {0,1}- {0,1}(Team|TEAM|team|TeAm|teAm|TEam|TEAm|tEAM|TeAM|TeaM)/) {goto NamenUmfangError;}

        igitt. es gibt den sogenannten i-modifier, mit dem wird die unterscheidung zwischen klein- und grossbuchstaben deaktiviert. das macht den code lesbarer:

        if($nick =~ /ez {0,1}- {0,1}team/i){  
          goto NamenUmfangError;  
        }
        

        "goto" sollte man uebrigens erfahrungsgemass vermeiden, es sei denn, man geht sehr, sehr sorgfaeltig damit um, und kann begruenden, warum man nicht einfach einen funktionsaufruf oder eine schleife oder aehnliches stattdessen verwendet.

        in perl kannst du uebrigens auch - wie im deutschen oder englischen - konditionalsaetze nachstellen und somit den ganzen krempel andersherum formulieren, z.b.
           goto NamenUmfangError if $nick =~ /ez {0,1}- {0,1}team/i;
        um zu entscheiden, was im konkreten fall besser ist, musst du dir ueberlegen, wie du das, was da vorgeht, jemandem erklaeren wuerdest. was ist wichtiger, die bedingung oder die (bedingte) aktion? ob du's falsch gemacht hast, merkst du, wenn sich dein code liest wie jedi yoda spricht, vgl. yoda condition.

        prost
        seth

      2. Hi,

        ergänzend zu seths hervorragender Erklärung möchte ich noch ein paar Möglichkeiten nennen:

        EZ {0,1}- {0,1}(Team|TEAM)

        Statt "{0,1}" kannst Du auch "?" schreiben, welches das vorhergehende Pattern (in dem Fall das Leerzeichen) hier optional macht.

        if ($nick =~ /(EZ|ez|Ez|eZ) {0,1}- {0,1}(Team|TEAM|team|TeAm|teAm|TEam|TEAm|tEAM|TeAM|TeaM)/) {goto NamenUmfangError;}

        Offenbar ist die Groß- oder Kleinschreibung wurscht, also empfiehlt sich der Schalter /i am Ende (siehe seths Antwort). Nur mal gesetzt den Fall, "EZ" solle immer groß geschrieben sein und nur beim "Team" sei es optional, so ginge auch:

        /EZ ?- ?[tT][eE][aA][mM]/

        oder z.B.

        /EZ ?- ?(?i:Team)/

        Meine bevorzugte Lösung wäre hier

        /EZ ?- ?Team/i

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. gudn tach!

          ergänzend zu seths hervorragender Erklärung möchte ich noch ein paar Möglichkeiten nennen:

          EZ {0,1}- {0,1}(Team|TEAM)

          Statt "{0,1}" kannst Du auch "?" schreiben, welches das vorhergehende Pattern (in dem Fall das Leerzeichen) hier optional macht.

          hatten wir schon. willernedd. ;-)

          prost
          seth

        2. Hi Cheatah

          Hab deine Lösung probiert:

          /EZ ?- ?Team/i

          Die funktioniert auch, und es ist hierbei völlig egal, was von dieser Kombination jetzt groß oder klein geschrieben wurde *top*

          Seth hat Eingangs irgendwo erwähnt, dass es auch einen längeren Minusstrich gibt. Stimmt, ich erinnere mich, dass Word das manchmal bei Bindungen oder Aufzählungen eingefügt hat.

          Herauszubekommen wäre nun, wie ich den aus meiner Tastatur prügle, und dann natürlich bei dem Würmchencode einzusetzen:

          ~/EZ ?(-|langesminus) ?Team/i

          Geht das vielleicht so?

          Gruss HP-User

          1. Hi nochmal

            Hi Cheatah

            Hab deine Lösung probiert:

            /EZ ?- ?Team/i

            Die funktioniert auch, und es ist hierbei völlig egal, was von dieser Kombination jetzt groß oder klein geschrieben wurde *top*

            Mist, jetzt hab ich ja doch die Fragezeichen benutzt! Sorry Seth, die hattest du ja schon empfohlen...

            Gruss HP-User

            1. gudn tach!

              Mist, jetzt hab ich ja doch die Fragezeichen benutzt! Sorry Seth, die hattest du ja schon empfohlen...

              in meiner unendlichen grosszuegigkeit erlaube ich es dir.

              prost
              seth

          2. gudn tach!

            Seth hat Eingangs irgendwo erwähnt, dass es auch einen längeren Minusstrich gibt.

            schlimmer als das:

            u+002d: hyphen-minus (allround-bindestrich-minus)
            u+2010: hyphen (viertelgeviertstrich)
            u+2011: non-breaking hyphen (nicht umbrechender viertelgeviertstrich)
            u+2012: figure dash
            u+2013: en dash (halbgeviertstrich)
            u+2014: em dash (geviertstrich)
            u+2015: horizontal bar
            u+2212: minus sign

            und das sind vermutlich noch nicht alle. die machen zwar im kontext semantisch nicht immer sinn, aber das sieht man ihnen nun mal leider haeufig nicht an.

            aber wer solche zeichen im web bei konventioneller eingabe verwendet, hat es vielleicht einfach verdient, mit einer entsprechenden meldung belohnt zu werden, sowas wie "hey, wow, toll, du kannst unicode! das ist mir jedoch unheimlich egal, weil es mir zu viel arbeit machen wuerde, das zu unterstuetzen, ohne dass es mir einen erkennbaren nutzen bringen wuerde." naja, ich uebertreibe und schweife ab.

            Herauszubekommen wäre nun, wie ich den aus meiner Tastatur prügle, und dann natürlich bei dem Würmchencode einzusetzen:

            ~/EZ ?(-|langesminus) ?Team/i

            Geht das vielleicht so?

            so aehnlich. einzelne zeichen werden am besten mit eckigen klammern zusammengefasst und dann ohne '|' dazwischen. und die ollen zeichen mit grossen unicode-hexwerten gibt man haeufig besser nicht explizit ein, sondern ueber die hexwerte, um gegen encoding-probleme etwas gewappneter zu sein:

            /EZ ?[-\x{2010}\x{2011}\x{2012}\x{2013}\x{2014}\x{2015}\x{2212}] ?Team/i

            innerhalb solcher zeichenklassen kann man die fuer in unicode aufeinanderfolgene zeichen abkuerzende schreibweise verwenden:

            /EZ ?[-\x{2010}-\x{2015}\x{2212}] ?Team/i

            das '-' wird zwischen zwei zeichen innerhalb einer zeichenklasse als "bis" interpetiert. am anfang (und auch am ende) einer zeichenklassendefinition wird es literal, also als '-' verstanden.

            aber dieser ganze unicode-spass macht den source-code haesslicher. je nach anwendung waere es zu ueberlegen, den unicode-fetisch einfach vorab mittels
              s/[\x{2010}-\x{2015}\x{2212}]/-/g;
            zu entfernen, um damit spaeter keine probleme mehr zu haben.

            prost
            seth

  2. gudn tach!

    Prinzipiell könnte ich alles mit IF-Abfragen angehen:


    if ($nick eq "EZ-Team") {Geh zum Fehlerblock;}

    Aber wie geht das bei *EZ-Team*? Also wenn vor und -oder hinter dem zu "matchendem" Teil noch was steht?

    grundsaetzlich geht das mit index, aber in deinem fall wuerde ich die anwendung regulaerer ausdruecke, also die loesung von Norbert bevorzugen, weil sie zu kuerzerem, leichter lesbarem und vermutlich auch schneller ausgefuehrtem code fuehrt.

    prost
    seth