Einzelnen Beitrag anzeigen

I.MacLeod

Registriert seit: 25. Aug 2005
5 Beiträge
 
#1

fastwild - Wildcard matching mit Kompilierung zur Laufzeit

  Alt 25. Aug 2005, 12:27
Aloah,

so, nachdem ich diese Unit schon im DF veröffentlicht habe (und sie brav in meinem aktuellen Projekt ihren Dienst verrichtet), werde ich dies dann jetzt endlich auch hier nachholen. Vielleicht kann der/die ein oder andere sie ja gebrauchen. (Hoffe ich zumindest mal)


nochmal 1. September: da hat sich ein kleiner Bug eingeschlichen. (Das kommt davon, wenn das Testprogramm so viele Fälle bearbeitet, dass man die oberen nicht mehr sieht, und einfach davon ausgeht, dass sie immernoch stimmen). "??" hatte sich verhalten wie "???*" (zumindest soweit ichs gesehn hab)
Jetzt sollte wieder alles funktionieren.

1. September: Ich hab mich kurzerhand dazu entschlossen auf eine 0.5 final zu verzichten, ein paar neue Optimierungen einzubauen und das Ergebnis 0.6 zu nennen. String-Vergleiche sollten nochmal was schneller durchlaufen.

28. August: Hier ist eine neue Betaversion. String-Blöcke mit einer Länge von 3 oder mehr als 4 werden jetzt wesentlich schneller verarbeitet. Ein Test von "simpletest" auf "simpletest" läuft beispielsweise ~ 7x so schnell durch. Download unten. Die äußerst zahlreichen Bugs bitte an mich weiterleiten - bei meinen Tests hat allerdings alles funktioniert.


Folgende Methoden werden zur Verfügung gestellt:
  • function CompileWildcardFunction(Pattern: AnsiString): TWildcardFunction; Erzeugt eine Funktion, die einen string mit "Pattern" vergleicht.
  • procedure FreeWildCardFunction(WildcardFunction: TWildcardFunction); Gibt eine mit CompileWildcardFunction erzeugte Funktion wieder frei.

Unterstützte Platzhalter:
  • Code:
      *
    ein beliebiger Text
  • Code:
      ?
    ein beliebiges Zeichen
  • Code:
    [...]
    sets mit ein paar Zusatzfunktionen
Beispiele:
  • Code:
    [a-z]
    a, b, c, ..., oder z
  • Code:
    [z-a]
    z, - oder a
  • Code:
    [a-]
    a oder -
  • Code:
    *oo
    foo oder zoo oder shampoo oder ...
  • Code:
    [*a-z]
    beliebig viele Buchstaben zwischen a und z.
    Zum Beispiel "hallo", aber nicht "Hallo"
  • Code:
    [+a-z]
    mindestens ein Buchstabe zwischen a und z
    Zum Beispiel "hallo", aber nicht "" (leerer String)
  • Code:
    [!a-z]
    ein Buchstabe nicht zwischen a und z
    zum Beispiel "H"
  • Code:
    [!*a-z]
    beliebig viele Buchstaben nicht zwischen a und z
    zum Beispiel "HALLO"
  • Code:
    [[-\]]
    ein Buchstabe zwischen [ und ]
  • Code:
    A\*
    der Text "A*"
  • Code:
    [+a-zA-Z]
    Hallo, hallo, HALLO, ...

Code-Beispiel:

Delphi-Quellcode:
var
  fkt: TWildcardFunction;
begin
  fkt := CompileWildcardFunction(eWildcard.Text);
  try
    if fkt(PChar(eText.Text)) then
      lAusgabe.Caption := 'Ja'
    else
      lAusgabe.Caption := 'Nein';
  finally
    FreeWildCardFunction(fkt);
  end;
end;
Natürlich ist die ganze kompiliererei in diesem Beispiel überflüssig - wenn ein paar tausend Dateinamen überprüft werden lohnt sich das natürlich schon eher ^^.

Bekannte Bugs:
  • derzeit keine, aber Patterns, die nicht funktionieren wie sie sollen, sind immer willkommen.
Wer will, kann (sofern er D2005 nutzt) irgendwo oben noch {$DEFINE D2005} einfügen, dann wird die Freigabe zur Inlinefunktion.

Cheers
Angehängte Dateien
Dateityp: pas fastwild_809.pas (22,8 KB, 67x aufgerufen)
{$APPTYPE CONSOLE}uses SysUtils;const a='{$APPTYPE CONSOLE}uses SysUtils;const a=%s;begin write(Format(a,[#39+a+#39]))end.';begin write(Format(a,[#39+a+#39]))end.
  Mit Zitat antworten Zitat