Reg. Ausdruck oder IF?
HP-User
- perl
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
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
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.
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
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...
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
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
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
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!***
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
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
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
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
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
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
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
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