Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 02.05.2008, 10:47 Titel: RegEx |
|
|
So
gestern hab ich den ganzen Abend mit RegEx rumgespielt. Mitlerweile scheint das auch schon ziemlich nett zu klappen, zum Beispiel hätte ich hier etwas um aus einem Dateinamen+Pfad nur den Pfad zu machen, oder um eine EMailadresse auszulesen:
Code: |
.*(\\|/) //Pfad trennen
([[:alnum:]]|_|\.|-)+@[[:alnum:]]+\.[[:alpha:]]+ //Emails trennen
|
Soweit bin ich davon auch schon ganz angetan, ich bin noch nicht ganz so fit mit boost::regex, aber wie gesagt, ein paar Beispiele gehen ja schon.
Jetzt wäre die Frage, ist RegEx schnell genug? Also RegEx scheint etwas sehr tolles und mächtiges zu sein, etwas wo man mit wenig aufwand und sehr wenig Code () ne Menge machen kann. Aber sollte ich daher Regex überall einsetzen?
Typisches Beispiel wäre z.B. das finden des Pfades einer Datei. Ich habe ein Modell und will die Textur aus dem selben Verzeichnis laden. Jetzt könnte ich das letzte / bzw. \ suchen und alles davor als Pfad nehmen, oder aber ich könnte Regex benutzen.
Desweiteren könnte man mit RegEx bestimmt auch schön Config Dateien auslesen, z.B. sich den Teil vor und nach dem = hohlen (ohne Whitespaces)
Oder ist RegEx zwar toll, aber für solche eher simplen Sachen total ungeeignet? Ich meine, eine lowlevel Implementierung wird immer schneller sein, aber ist Regex jetzt z.b. beim Pfad trennen 2 mal so langsam oder 1000 mal so langsam? Soll ich es immer benutzen, oder gibt es Stellen, wo es wegen Speicher/Geschwindigkeit sinnvoll wäre auf Regex zu verzichten? _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
FH Super JLI'ler
Alter: 36 Anmeldedatum: 16.10.2004 Beiträge: 438
Medaillen: Keine
|
Verfasst am: 02.05.2008, 12:31 Titel: |
|
|
Ich kenne RegEx bisher nur aus PHP und Java, und in beidem wird geraten, RegEx so wenig wie Möglich zu nutzen, da die wohl extra kompiliert werden müssen, was sehr zeit intensiv ist.
Ich weiß nicht, wie das in boost ist, aber ich nehme an, es ist da ähnlich.
Gruß
FH _________________ goto work, send your kids to school
follow fashion, act normal
walk on the pavement, watch T.V.
save for your old age, obey the law
Repeat after me: I am free |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 04.05.2008, 11:05 Titel: |
|
|
Jop das ist relativ flott. Der Mechanismus dahinter ist nur ein Endlicher Automat mit ein paar Zuständen der Zeichen für Zeichen den Prüfstring durchläuft. Compiler arbeiten damit auch und die sind ja auch schnell bei der Sache. :) _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 04.05.2008, 12:16 Titel: |
|
|
d.h. wenn ich eine RegEx erstelle, denkt der Rechner erstmal ein wenig und steckt sich was zusammen, wenn ich mit einer fertigen Regex dann irgendetwas mache, ist das ziemlich schnell?
Also was weiß ich, im Zeitraum von vieleicht 2 mal langsamer als alles hardgecodet wäre? _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 04.05.2008, 14:55 Titel: |
|
|
ja genau: regular expressions sind so konzipiert, dass sie durch Automaten (s. hazel) erstellt werden können. boost:regex ist eigentlich eine Parade-Implementierung, die sowohl schnell, als auch vorausbaubar und leicht ist. Also am meisten Geschwindigkeit kannst du sparen, wenn du vorher den Automat erstellst, also diesen Matcher oder so, und dann nur dagegen testest. Also als beispiel: so früh wie möglich ein regex.assign() ausführen um den Automaten zu bauen, dann kannst du mit regex_match relativ schnell immer wieder gegen diesen automaten testen.
Gruß DXer |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 04.05.2008, 15:54 Titel: |
|
|
Guddie.
Erste Test ergaben, dass ein Minibeispiel, das boost::regex benutzt ~400kb groß ist. Statisch gelinkt. Macht also irgendwas zwischen 100-350 kb zusätzlich für sowas schickes wie regex, ich denke das ist ganz ok, solange man es nicht bloß für eine kleine Stelle benutzt. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 07.05.2008, 18:09 Titel: |
|
|
Hey JK :)
Falls du viel mit RegEx's machen musst kann ich dir Flex bzw JFlex empfehlen. Damit kannst du nen Parser bauen dem du nur nen großen String füttern musst und es liefert dir die gelesenen "Tokens"(1 Token pro RegEx) sowie die Werte die du vll daraus filterst. Man kann mit RegEx's nämlich net nur Muster erkennen sondern aus den gefundenen Mustern auch live und direkt Werte (nennt sich dort "Gruppen".. benannt oder unbenannt) entziehen. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
|