• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

RegEx erweitern

mo

Administrator
Teammitglied
Hallo,
ich habe hier einen regulären Ausdruck, der folgende Eingaben zulassen soll:
1. 10:00 - 20:00 oder jeden anderen Zeitraum
2. frei
3. krank
4. urlaub
Wie kann ich ihn erweitern, dass ich vor 1 - 4 noch optional "NB;" eingeben kann?
Also z.B. "NB;14:00 - 22:00"?
 
Reguläre Ausdrücke sind auch nicht das Zauberwerkzeug. sie sind langsam und je nach Komplexität kaum noch zu durchschauen. Im Zweifel ist ein einfacher Stringvergleich immer die bessere Wahl.
 
@junke: danke, so hab ichs gestern bereits zurechtgefummelt
@ein schlauer: du sprichst mir aus der seele. grausames zeug das :)
 
Lassen wir mal die Redensarten beiseite ;)
Um einen einzelnen String zu suchen, sind Stringfunctionen schneller und weniger fehleranfällig, keine Frage. Wenn es etwas komplexer wird, ist der Einsatz von regulären Ausdrücken immer eine Überlegung wert. Denn die Algorithmen für Reguläre Ausdrücke sind gut optimiert und gar nicht soo langsam (Faktor 1,5 für den einfachen Fall, Quelle).
Im Klartext: Bevor ich 2x eine String-Function aufrufe ist preg u.U. schon schneller!
 
Ich sagte ja "im Zweifel" und wenn es etwas komplexer wird ist natürlich ein Regulärer Ausdruck eine Überlegung Wert, bzw. sogar meistens sinnvoll. Ich programmiere ja viel in Perl, da sind Reguläre Ausdrücke Alltag.

Den Test dort auf der Seite bezweifle ich, dann müßte der RegEx Parser in PHP besser optimiert sein als unter Perl, was ich nicht glaube.

Mit JS komme ich auf Geschwindigkeitsvorteile vom Faktor 10 und darüber, auch bei der Suche nach mehreren Wörtern. Ich habe noch einen kurzen Perltest gemacht, da wurde der Unterschied, wenn ich einfach nur Wörter suche, umso größer je mehr ich gesucht habe. Bei zwei Wörter das 30 fache.
 
hmm, ich weiß nicht wie man mit PHP einen Benchmark erstellt. In Perl geht so was. Der String ist relativ kurz und ich suche nach ob ein Wort enthalten ist, das erste ist es nicht, das zweite schon
Code:
#!perl -w
use strict;
use Benchmark ();

my $str_1 = 'ein  Teststring, der ein Suchwort enthält, dass die Funktionen suchen soll';
my $str_2 = 'xxxx';
my $str_3 = 'Suchwort';
my $count = 1000000;
my $test = {
        'reg' => sub
        {
            return $str_1 =~ /$str_2|$str_3/i;
        },
        'index' => sub
        {
            return index($str_1, $str_2) > -1 || index($str_1, $str_3) > -1;
        }
};
my $tm =  Benchmark::cmpthese($count, $test);

Code:
struppi@struppi-desktop:~/projekte/perl$ perl ./benchmark.pl
           Rate   reg index
reg    263992/s    --  -92%
index 3289474/s 1146%    --
struppi@struppi-desktop:~/projekte/perl$

Entweder optimiert PHP Reguläre Ausdrücke besser als Perl oder die String Funktionen extrem langsam.
 
Mein Test ist nur so ca., packe die Anweisungen in eine for-Schleife und vernachlässige diese auch noch.
preg = 340136/s
strpos = 819672/s
(Hab kein Supercomputer!)
Ist ja sowieso nicht direkt vergleichbar, aber die Stringfkt. strpos scheint nicht die schnellste zu sein...

Edit: Noch eine letzte Anmerkung sei gestattet. Echte Leistung wird erst durch preg_match_all erreicht. Aktueller Fall bei mir:
250 Messwerte aus 8KByte rausfiltern und in ein mehrdimensionales Array packen mit bequemen Zugriff über Schlüssel, 2 Zeilen Code, 1 ms Ausführungszeit, will man da noch optimieren ???
 
Zuletzt bearbeitet:
Meine Aussage wird dadurch nicht falsch:
Reguläre Ausdrücke sind auch nicht das Zauberwerkzeug. sie sind langsam und je nach Komplexität kaum noch zu durchschauen. Im Zweifel ist ein einfacher Stringvergleich immer die bessere Wahl.

Wenn PHP wirklich so optimiert ist (oder so langsam), dass es kaum einen Unterschied macht, dann gilt diese Aussage halt nur bedingt für PHP. Bei anderen Programmmiersprachen, wo der Unterschied wesentlich deutlicher ist, sollte man meinen Vorschlag auf jeden Fall überdenken.
 
Mein Test ist nur so ca., packe die Anweisungen in eine for-Schleife und vernachlässige diese auch noch.
preg = 340136/s
strpos = 819672/s
(Hab kein Supercomputer!)
Ist ja sowieso nicht direkt vergleichbar, aber die Stringfkt. strpos scheint nicht die schnellste zu sein...

Edit: Noch eine letzte Anmerkung sei gestattet. Echte Leistung wird erst durch preg_match_all erreicht. Aktueller Fall bei mir:
250 Messwerte aus 8KByte rausfiltern und in ein mehrdimensionales Array packen mit bequemen Zugriff über Schlüssel, 2 Zeilen Code, 1 ms Ausführungszeit, will man da noch optimieren ???

Also bezweifle ich nach wie vor solche Messungen. Im Internet finde ich Quellen, die sagen, das ein regulärer Ausdruck auch unter PHP langsamer ist, als von dir gesagt. Es gibt aber anscheinend keine vernünftige Methode um das zu messen, zumal du aufpassen musst, wenn du einen festen Ausdruck, der sich im Programmablauf nicht ändert, misst wird dieser soweit ich gesehen habe vorkompiliert, d.h. du misst nicht den regulären Ausdruck an sich, sondern nur mehr oder weniger die Schleifendurchgänge.

Also ich bleibe dabei, ein regulärer Ausruck ist langsam (auf der Programmiersprache für reguläre Ausdrücke, Perl, bis zu 300 mal so langsam) und es sollte ein Stringvergleich vorgezogen werden, wenn dieser Vergleich nicht zu komplex ist und häufig mit wechselnden Parametern aufgerufen wird (vorkompilierte Ausdrücke, gibt es auch in Perl, dazu dient der x modifier)
 
Zurück
Oben