Schrift
[thread]11526[/thread]

wann regexp sinnvoll (nicht) nutzen



<< |< 1 2 >| >> 17 Einträge, 2 Seiten
Hagen
 2008-03-27 10:54
#107527 #107527
User since
2007-09-06
233 Artikel
BenutzerIn
[default_avatar]
Hallo,

seit ich Perl nutze und regexp 'entdeckt' habe nutze sich diese relativ gerne und bei fast jeder Gelegenheit, da sie häufig (für mich) sehr praktisch und einfach zu verwenden sind.

Beim Lesen einiger Forenbeiträge ist mir aufgefallen, dass ab und zu von der Nutzung abgeraten wird, da regexp für manche Probleme überdimensioniert (?) seien bzw. zu viele Ressourcen verbrauchen würden. Allerdings wurde dieses nirgends so richtig erklärt bzw. keine passende Alternative vorgeschlagen. Auch in diversen Hilfen, Tutorials, ... habe ich dazu keine Informationen finden können.

Daher würde ich mich über einen groben Überblick, an welchen Stellen man regexp sinnvoll (nicht) benutzt und vor allem warum, sehr freuen.

Das ist leider eine recht allgemeine Fragestellung und daher wahrscheinlich auch nicht ganz einfach zu beantworten, aber bisher habe ich noch nichts dazu finden können.

Gruß

Hagen
Gruß
Hagen
Gast Gast
 2008-03-27 11:09
#107528 #107528
Sinnvoll sind Regex überall.

Das mit der Performance musst du im Grunde genommen für dein Anwendungsgebiet ausprobieren und einen Benchmark mit dem Skript machen, ob es mit RegEx langsam ist oder nicht.
nepos
 2008-03-27 11:36
#107531 #107531
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Zum Benchmarken würde ich dir da CPAN:Benchmark empfehlen. Damit kannst du recht einfach vergleichen, welche Varianten schneller sind :)

Was bei RegExes auch oft Performance bringt ist, wenn du zwar (..|..|..) hast, aber das gematchte eigentlich nicht brauchst. Das kannst du dann z.B. (?:..|..|..) schreiben, was auch bisschen was bringt.
pq
 2008-03-27 11:36
#107532 #107532
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Code (perl): (dl )
1
2
3
4
5
$string =~ s/a/b/g; # ueberdimensioniert
$string =~ tr/a/b/; # genau das richtige

if ($string =~ m/^foo\z/) # ueberdimensioniert
if ($string eq 'foo')     # genau das richtige

der punkt ist, viele haben schon von regex gehört und versuchen
damit gleich alles zu erschlagen. dabei gibt es für
ersetzungen von einzelnen zeichen tr///, und um strings
auf gleichheit zu prüfen, werden tatsächlich oft regexes
bemüht. regex statt eq. das ist total unnötig.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Linuxer
 2008-03-27 12:44
#107534 #107534
User since
2006-01-27
3875 Artikel
HausmeisterIn

user image
Oder auch das Vorkommen eines (festen) Teilstrings innerhalb eines größeren Strings. Hierfür ist i.A. index() schneller als Regex.
Auch wenn es "nicht so toll" aussieht.

Code (perl): (dl )
index( $string, 'substring' ) >= 0

vs
Code (perl): (dl )
$string =~ m/substring/

meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
DanielH
 2008-03-27 19:49
#107561 #107561
User since
2007-11-15
54 Artikel
BenutzerIn
[default_avatar]
Split ist eine meiner meistbenutzten Funktionen in Perl
(einen String anhand eines Teilstrings aufteilen).

Folgende Links werden dich vermutlich interessieren:

Was man mit RegEx tun sollte und was nicht:
http://www.hidemail.de/blog/do-and-do-not-regex.sh...

Zeiteffizientes Programmieren mit regulären Ausdrücken:
http://www.cis.uni-muenchen.de/~hbosk/perl2_ws03/p...
(erst ab der Mitte)
Gast Gast
 2008-03-27 22:05
#107564 #107564
DanielH+2008-03-27 18:49:27--
Split ist eine meiner meistbenutzten Funktionen in Perl
(einen String anhand eines Teilstrings aufteilen).


Teilstring? Regex meinst Du...
betterworld
 2008-03-27 22:14
#107565 #107565
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Wenn man Regexes benutzt, kann man auch in viele Fallen treten. Und damit meine ich nicht nur Performancefallen, sondern auch Verstaendnisprobleme, die Anfaenger oft haben, und dadurch koennen einige Bugs oder Sicherheitsprobleme entstehen.

1. Aufpassen beim Einbetten von Variablen: \Q benutzen
2. Den Unterschied zwischen $ und \z verinnerlichen
3. "." (Punkt) matcht nicht auf jedes Zeichen ohne /s
4. Nie $1 verwenden, ohne sichergestellt zu haben, dass der Ausdruck gematcht hat.

Hab jetzt bestimmt noch ein paar vergessen.

(Der Beitrag ueber diesem ist uebrigens auch von mir, ich habe das Anmelden vergessen.)
Gast Gast
 2008-03-27 22:54
#107568 #107568
Laut Perl-Manpage verursachen $&, $` und $' eine beachtliche "performance penalty".
Mithilfe von @+ und @- soll es schneller gehen.
DanielH
 2008-03-27 23:04
#107570 #107570
User since
2007-11-15
54 Artikel
BenutzerIn
[default_avatar]
@ betterworld:
ups, stimmt, du hast Recht.
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



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