betterworld+2008-03-29 01:32:05--sid burn+2008-03-28 23:23:23--$ => Bedeutet String-ende ODER Newlinezeichen vor String-ende.
Fast. Es matcht nicht auf das Newlinezeichen, sondern *vor* dem Newlinezeichen.
Ja, habe ich nicht genau beschrieben.
----
Noch zum Thema. Ich halte Regee zwar für sehr mächtig. In der Regel werden aber Regexe aber zu schnell überbewertet. Bzw. es wird unterschätzt eine Korrekte Regex zu schreiben.
Nehmen wir das Beispiel du möchtest Wissen ob eine Zahl eingegeben wurde.
Der erste Versuch könnte so lauten.
Damit deckst du aber nur Integer Zahlen ab. Aber das noch nichtmal Korrekt. Zahlen können auch negativ sein, genauso könntest du ein + vorran schreiben.
Ist schon besser, aber es werden noch nicht alle Zahlen abgedeckt. z.B. keine Kommazahlen.
m/ \A [-+]? \d+ [.] \d+ \z /xms
Hier werden nun Zahlen wie "123.24" erkannt etc. Allerdiengs wieder ein neues Problem. Der Dezimalpunkt und das ende muss jetzt immer vorkommen.
m/ \A [+-]? \d+ (?: [.] \d+ )? \z /xms
Nun ist auch das ende Optional. Allerdiengs wenn man "0.1234" eingeben möchte erwarten viele Nutzer das man auch die 0 weg lassen kann und ein ".1234" eingeben kann. Der erste Versuch könnte so aussehen.
m/ (?: \A [+-]? \d+ )? (?: [.] \d+ )? \z /xms
Zwar erkennt diese Regex zwar nun 123.24 genauso wie ".1234" allerdiengs wenn du genau auf die Regex achtest dann besteht sie aus zwei großen Gruppierungen.
m/ (?: ... )? (?: ... )? /xms
Beide Gruppierungen sind allerdiengs wegen dem Fragezeichen Optional. Daher wäre nun auch die Falsche eingabe von "" korrekt. Was du sicherlich nicht möchtest. Also musst du eine Alternation nutzen.
m/ \A (?: [+.]? \d+ (?: [.] \d+ )? | [.] \d+ ) \z /xms
In diesem Beispiel wird nun eine Zahl erkannt, egal ob Fließkomme oder nicht. Und die verkürzte Schreibeweise von ".1234" geht auch.
1) Bisher habe ich aber nur validiert. Beim auslesen musst du noch klammern hinzufügen.
2) Ein Support für die Wissenschaftliche Notation "12e34" wäre noch nicht schlecht.
3) Was ist mit dreier Seperatoren? "123,456.56" ?
Wie man sieht ist alleine dieses kleine simple Beispiel schon komplex genug. Das Problem sehe ich aber nicht an den Regexen sondern an den Personen die diese nutzen. Alzu oft werden Regexe einfach übergeschätzt. Und gerade das Korrekte schreiben von Regexen ist besonders schwer. Eine korrekte Regex bedeutet das eine Regex nur das matcht was du auch möchtest. Und bei falschen eingaben auch nicht matcht, und auch noch am schnellstmöglichen sich beendet. Und genau das ist der schwere Punkt.
Ein anderer Punkt wie "#Kein Kommentar" bereits sagte ist das manche Leute sehr schnell dazu tendieren Regexe für jede Möglichkeit zu nutzen. Beispielsweise um HTML, XML zu Parsen. Oder jegliche andere Dinge. Man kann zwar auch mit Regexen Parsern bauen aber wenn man alles korrekt machen möchte ist der Aufwand es einfach nicht wert. Hier sollte man definitiv vorhandene Module nutzen.
Für das obere Beispiel mit dem erkennen von Zahlen etc. sowas kommt so häufig vor das auch dafür bereits einf ertiges Modul gibt => Regexp::Common. Anstatt also ständig den weg immer wieder von neuem durchzugehen sollte man gleich das Modul verwenden. Man benutzt hier sehr gut getestete Regexe, und das diese alle Kinderkrankheiten bereits beseitigt haben ist auch anzunehmen. Weiterhin sind diese flexibel anpassbar. Weiterhin kann man auch "looks_like_number()" aus Scalar::Util nutzen. Was allerdiengs nicht alles kann wie solch eine Regex. Weiterhin erkennt es auch "Inf" als korrekte Zahl an. Sofern man das Modul "bignum" nicht geladen hat, ist dieses aber nicht unbedingt gewünscht. Und man sollte noch ein test machen ob die Eingabe nicht "Inf" ist.
Wofür Regexe auch mal schnell genommen werden ist wenn man in einem Text schnell mal ein paar Ersetzungen machen möchte. Dann werden im Text schnell paar Sondernzeichen hinzugefügt und über der Datei schnell mal eine Substitution ausgeführt die dann die Ersetzungen vornehmen möchte. Und nachdem man dann etliche Bugs behoben hat. Möchte man irgendwann sowas wie simple schleifen etc. und ehe man sich versieht hat man sein eigenes Templating System geschrieben. Leichter und besser wäre es man hätte gleich von anfang an ein bereits vorhandenes Templating System genutzt.
Und so führen sich die Beispiele immer weiter. Das Problem sind aber wie gesagt nicht die Regexe sondern eher die Leute die diese nutzen.
Man lernt Regexe. Lernt die mächtigkeit zu schätzen und versucht gleich alles damit zu erschlagen. Und das sehe ich viel mehr als Problem an.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de