Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]11526[/thread]

wann regexp sinnvoll (nicht) nutzen (Seite 2)



<< |< 1 2 >| >> 17 Einträge, 2 Seiten
Gast Gast
 2008-03-27 23:13
#107571 #107571
Gast+2008-03-27 21:54:59--
Laut Perl-Manpage verursachen $&, $` und $' eine beachtliche "performance penalty".
Mithilfe von @+ und @- soll es schneller gehen.



ups, ist ein bißchen am Thema vorbei.
#Kein Kommentar
 2008-03-28 01:04
#107578 #107578
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
was ich letzens erst wieder gelernt habe, dass man das parsen von
HTML-dokumenten oder sonstiges XML-kram nicht mit seiner eigener Regexp lösen
sollte, sondern module dafür benutzen sollte.

man überschätz sich selbst leicht, wenn man denkt vollwertiges HTML durch seine
eigenen kleinen schnellen regexp parsen zu können.
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
renee
 2008-03-28 09:28
#107584 #107584
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
#Kein Kommentar+2008-03-28 00:04:21--
was ich letzens erst wieder gelernt habe, dass man das parsen von
HTML-dokumenten oder sonstiges XML-kram nicht mit seiner eigener Regexp lösen
sollte, sondern module dafür benutzen sollte.

man überschätz sich selbst leicht, wenn man denkt vollwertiges HTML durch seine
eigenen kleinen schnellen regexp parsen zu können.


Oh ja und vor allem gibt es wirklich gute Module für diese Aufgabe. Da wird das Programm auch viel übersichtlicher und wartbarer!
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Hagen
 2008-03-28 22:45
#107617 #107617
User since
2007-09-06
233 Artikel
BenutzerIn
[default_avatar]
Dank für die vielen Anregungen und Informationen!

Kann mir vielleicht gleich noch jeman einen Tippe geben, was genau der Unterschied ist?

betterworld+2008-03-27 21:14:54--
2. Den Unterschied zwischen $ und \z verinnerlichen
Gruß
Hagen
sid burn
 2008-03-29 00:23
#107619 #107619
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Hagen+2008-03-28 21:45:18--
Kann mir vielleicht gleich noch jeman einen Tippe geben, was genau der Unterschied ist?

betterworld+2008-03-27 21:14:54--
2. Den Unterschied zwischen $ und \z verinnerlichen


\z => bedeutet String Ende.

$ => Bedeutet String-ende ODER Newlinezeichen vor String-ende.
Wenn man die Option /m einschaltet bedeutet $ allerdiengs ein match vor Newline Zeichen, irgendwo im String.

---

^ und \A sollte man auch unterschieden.

^ => bedeutet Stringanfang. Wenn die Option /m aktiviert ist bedeutet es match nach Newline Zeichen.

\A => bedeutet immer Stringanfang.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
betterworld
 2008-03-29 02:32
#107620 #107620
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
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.
sid burn
 2008-03-29 15:57
#107623 #107623
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
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.
Code: (dl )
m/ \A \d+ \z /xms

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.

Code: (dl )
m/ \A [-+]? \d+ \z /xms

Ist schon besser, aber es werden noch nicht alle Zahlen abgedeckt. z.B. keine Kommazahlen.

Code: (dl )
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.

Code: (dl )
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.

Code: (dl )
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.
Code: (dl )
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.

Code: (dl )
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
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2008-03-27 10:54.