![]() |
Token Funktionen
Liste der Anhänge anzeigen (Anzahl: 1)
Moin,
ich möchte hier meine Token-Funktionen, die ich z.B oft zum Parsen von Text verwende, veröffentlichen - falls sie denn jemand braucht. Wer mIRC kennt, der kennt sie sicher ;). Ich gebe hier mal ein Example, anhand von NumTok()/GetTok(), wo soetwas sinnvoll sein kann. Nehmen wir einmal an, Ihr empfangt Text von einer Socket-Kompomente, der so aussieht: Zitat:
Delphi-Quellcode:
In einigen Fällen könnte das auch fehlschlagen, da Paramater1 und Parameter2 vielleicht optional sind und daher kein Space mehr nach "command" kommt.
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket); var S, Command: string; begin S := Socket.ReceiveText; Delete(S, 1, Pos(' ', S)); Command := Copy(S, 1, Pos(' ', S)-1); if Command = 'irgendeincommand' then ... end; Demnach müsstet Ihr euren Code vielleicht sogar so schreiben:
Delphi-Quellcode:
Nicht sehr schön :).
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket); var S, Command: string; begin S := Socket.ReceiveText; Delete(S, 1, Pos(' ', S)); S := S + ' '; Command := Copy(S, 1, Pos(' ', S)-1); if Command = 'irgendeincommand' then ... end; Per GetTok() könnte das ganze nun so aussehen:
Delphi-Quellcode:
:P
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket); var S, Command: string; begin S := Socket.ReceiveText; if GetTok(S, 2, ' ') = 'irgendeincommand' then ... end; Ein anderes Beispiel: Nehmen wir mal an Ihr wollt alle einzelnen Wörter eines Strings in eine ListBox haben und dummerweise sind mehrere Seperatoren(in unserem Fall spaces) nebeneinander dann könntet Ihr statt:
Delphi-Quellcode:
einfach per GetTok()/NumTok() folgendes machen:
procedure Parse;
var S: string; begin S := ' Wort1 Wort2 Wort3 Wort4 '; // Ja, ein so aufgebauter String ist selten :-D - Aber möglich. Ich will hier nur zeigen das immer die richtigen Ergebnisse ausgegeben werden. while Pos(#32#32, S) > 0 do //Solange doppelte Spaces vorhanden sind... Delete(S, Pos(#32#32), 1); // Lösche eines davon while Pos(' ', S) > 0 do // Solange ein Space vorhanden ist... begin ListBox1.Items.Add(Copy(S, 1, Pos(' ', S)-1)); // Füge String bis zum Space-1 zur Listbox hinzu Delete(S, 1, Pos(' ', S)); // Lösche bis zum ersten Space inklusive selbigem. end; // Kann sein das keine Spaces mehr vorhanden sind, dennoch muss der String noch nicht leer sein... if S <> '' then ListBox1.Items.Add(S); end;
Delphi-Quellcode:
Ich habe zusätzlich noch eine weitere/schnellere Methode für diesen Fall implementiert (Tokenize()). Ihr könnt den String inhalt also auch so in eure Listbox laden:
procedure Parse;
var S: string; I: Integer; begin S := ' Wort1 Wort2 Wort3 Wort4 '; for I := 1 to NumTok(S, ' ') do // Wird "4" zurückgeben. ListBox1.Items.Add(GetTok(S, I, ' ')); Holt den Token N anhand des Indexes I end;
Delphi-Quellcode:
Ich hoffe die Beispiele reichen so.
procedure Parse;
var DynArray: array of string; I: Integer; begin S := ' Wort1 Wort2 Wort3 Wort4 '; DynArray := Tokenize(S); for I := 0 to High(DynArray) do ListBox1.Items.Add(DynArray[I]); end; Ich werde hier nochmal alle Methoden kurz beschreiben: Zitat:
Beispiel:
Delphi-Quellcode:
Das Ergebnis von "Ergebnis" wäre hier: "hallo.wie.gehts.hallo.blubb"
procedure Beispiel;
const S = 'hallo.wie.gehts.hallo'; var Ergebnis: string; begin Ergebnis := AddTok(S, 'blubb', '.'); end; Zitat:
Beispiel:
Delphi-Quellcode:
Das Ergebnis von "Ergebnis" wäre hier: "hallo.gehts.hallo"
procedure Beispiel;
const S = 'hallo.wie.gehts.hallo'; var Ergebnis: string; begin Ergebnis := DelTok(S, 2, '.'); end; Zitat:
Beispiel:
Delphi-Quellcode:
Das Ergebnis von "Ergebnis" wäre hier: "hallo.hallo"
procedure Beispiel;
const S = 'hallo.wie.gehts.hallo'; var Ergebnis: string; begin Ergebnis := DelTok(S, 2, 3, '.'); end; Zitat:
Sollte N 0 sein, werden Die Menge der Übereinstimmungen zurückgeliefert. Beispiel:
Delphi-Quellcode:
Das Ergebnis von "Ergebnis" wäre hier: "4"
procedure Beispiel;
const S = 'hallo.wie.gehts.hallo'; var Ergebnis: Integer; begin Ergebnis := FindTok(S, 'hallo', 2, '.'); end; Zitat:
Beispiel:
Delphi-Quellcode:
Das Ergebnis von "Ergebnis" wäre hier: "gehts"
procedure Beispiel;
const S = 'hallo.wie.gehts.hallo'; var Ergebnis: string; begin Ergebnis := GetTok(S, 3, '.'); end; Zitat:
Beispiel:
Delphi-Quellcode:
Das Ergebnis von "Ergebnis" wäre hier: "wie.gehts"
procedure Beispiel;
const S = 'hallo.wie.gehts.hallo'; var Ergebnis: string; begin Ergebnis := GetTok(S, 2, 3, '.'); end; Zitat:
Sollte N über die Menge der Token in S liegen, wird der eizufügende Token (T) and das Ende von S angefügt. Beispiel:
Delphi-Quellcode:
Das Ergebnis von "Ergebnis" wäre hier: "hallo.wie.jojo.gehts.hallo"
procedure Beispiel;
const S = 'hallo.wie.gehts.hallo'; var Ergebnis: string; begin Ergebnis := InsTok(S, 'jojo', 3, '.'); end; Zitat:
Beispiel:
Delphi-Quellcode:
Das Ergebnis von "Ergebnis" wäre hier: "True"
procedure Beispiel;
const S = 'hallo.wie.gehts.hallo'; var Ergebnis: Boolean; begin Ergebnis := IsTok(S, 'hallo', '.'); end; Zitat:
Beispiel:
Delphi-Quellcode:
Das Ergebnis von "Ergebnis" wäre hier: "hallihallo"
procedure Beispiel;
const S = 'hallo.wie.gehts.hallihallo'; var Ergebnis: string; begin Ergebnis := MatchTok(S, 'hal', 2, '.'); end; Beispiel2:
Delphi-Quellcode:
Das Ergebnis von "Ergebnis" wäre hier: "2"
procedure Beispiel;
const S = 'hallo.wie.gehts.hallihallo'; var Ergebnis: Integer; begin Ergebnis := MatchTok(S, 'hal', 0, '.'); end; Zitat:
Beispiel:
Delphi-Quellcode:
Das Ergebnis von "Ergebnis" wäre hier: "4"
procedure Beispiel;
const S = 'hallo.wie.gehts.hallo'; var Ergebnis: Integer; begin Ergebnis := NumTok(S, '.'); end; Zitat:
Beispiel:
Delphi-Quellcode:
Das Ergebnis von "Ergebnis" wäre hier: "hallo.blah.gehts.hallo"
procedure Beispiel;
const S = 'hallo.wie.gehts.hallo'; var Ergebnis: string; begin Ergebnis := PutTok(S, 'blah', 2, '.'); end; Zitat:
Beispiel:
Delphi-Quellcode:
Das Ergebnis von "Ergebnis" wäre hier: "hallo.wie.gehts"
procedure Beispiel;
const S = 'hallo.wie.gehts.hallo'; var Ergebnis: string; begin Ergebnis := RemTok(S, 'hallo', 2, '.'); end; Zitat:
Beispiel:
Delphi-Quellcode:
Das Ergebnis von "Ergebnis" wäre hier: "hallo.wie.gehts.jojo"
procedure Beispiel;
const S = 'hallo.wie.gehts.hallo'; var Ergebnis: string; begin Ergebnis := RepTok(S, 'hallo', 'jojo', 2, '.'); end; Zitat:
Beispiel:
Delphi-Quellcode:
Das Ergebnis von "Ergebnis" wäre hier:
procedure Beispiel;
const S = 'hallo.wie.gehts.hallo'; var Ergebnis: array of string; begin Ergebnis := Tokenize(S, '.'); end; [0] = "hallo" [1] = "wie" [2] = "gehts" [3] = "hallo" Zitat:
Beispiel:
Delphi-Quellcode:
Das Ergebnis von "Ergebnis" wäre hier: "hallo"
procedure Beispiel;
const S = 'hallo.wie.gehts.hallo'; var Ergebnis: string; begin Ergebnis := WildTok(S, 'h*l', 2, '.'); end; Beispiel:
Delphi-Quellcode:
Das Ergebnis von "Ergebnis" wäre hier: "2"
procedure Beispiel;
const S = 'hallo.wie.gehts.hallo'; var Ergebnis: string; begin Ergebnis := WildTok(S, 'h*l', 0, '.'); end; Es ist egal wieviele Seperatoren nebeneinander stehen, doppelte werden immer ignoriert! Übrigens: Einige Methoden haben den Parameter "CS", er gibt an, ob Gross/Kleinschreibung beachtet werden soll. Um die Methoden benutzen zu können, müsst ihr eine Instanz von "TTokenizer" anlegen und könnt dann per: "Instanz." auf dessen Methoden zugreifen. Die Unit ist im Anhang. MfG |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz