Wir wissen, dass es in Java einen StringTokenizer gibt, der für die Zeichenfolgenverarbeitung sehr praktisch ist, aber diese Funktion wird in Delphi nicht bereitgestellt. Ich verweise auf die Delphi-Version und die C#-Version der Java-Sprache, um diese Funktion zu implementieren. Ich hoffe, Ihnen eine Bequemlichkeit zu bieten. Ich hoffe, Sie können mir weitere Ratschläge geben. [email protected]
Einheit SkyStringTokenizer;
{String-Analyse- und Verarbeitungsklasse
Autor: Zeng Qingsong
Zeit: 21.02.2004 (Silvester 2003)
}
Schnittstelle
verwendet
SysUtils, Klassen;
Typ
IIterator = Schnittstelle
Funktion hasNext(): boolean;
Funktion next(): string;
Ende;
Typ
TSkyStringTokenizer = class(TComponent, IIterator)
Privat
Token: TStringList;
Index: Ganzzahl;
Daten: Zeichenfolge;
Trennzeichen: Zeichenfolge;
procedure init(dataLine: string; delim: string);
function CharacterInTokens(ch: string; const sl: TStringList): boolean;
function StringToCharArray(delim: string): TStringList;
function SplitString(source, ch: string): Tstringlist;
geschützt
{Geschützte Erklärungen}
öffentlich
{Öffentliche Erklärungen}
Konstruktor create(dataLine: string overload);
Konstruktor Create(dataLine: string; delim: string overload);
Destruktor destroy();override;
Funktion hasNext(): boolean;
Funktion next(): string;
veröffentlicht
{ Veröffentlichte Erklärungen }
Ende;
Verfahren Registrieren;
Durchführung
Verfahren Registrieren;
beginnen
RegisterComponents('SkyDevKit', [TSkyStringTokenizer]);
Ende;
{ TStringTokenizer }
Funktion TSkyStringTokenizer.hasNext: boolean;
beginnen
Ergebnis := (index < tokens.Count - 1);
Ende;
procedure TSkyStringTokenizer.init(dataLine, delim: string);
beginnen
Token := TStringList.Create();
Trennzeichen := Trennzeichen;
Daten := dataLine;
Token := SplitString(data, delimiter);
//tokens := data.Split(delimiter.ToCharArray());
Index := -1;
Ende;
Funktion TSkyStringTokenizer.next: string;
var
s: Zeichenfolge;
beginnen
inc(index);
s := tokens[index];
while ((length(s) <= 0) and (index < tokens.Count)) tun
beginnen
inc(index);
s := tokens[index];
Ende;
Ergebnis := s;
Ende;
function TSkyStringTokenizer.StringToCharArray(delim: string): TStringList;
var
sl: TStringList;
I: Ganzzahl;
beginnen
sl := TStringList.Create();
for I := 1 to length(delim) do // Iterate
beginnen
sl.Append(copy(delim, i, 1));
Ende; // für
Ergebnis := sl;
Ende;
Konstruktor TSkyStringTokenizer.Create(dataLine, delim: string);
beginnen
geerbt Create(nil);
self.init(dataLine, delim);
Ende;
Konstruktor TSkyStringTokenizer.Create(dataLine: string);
beginnen
geerbt Create(nil);
self.init(dataLine, ' ');
Ende;
function TSkyStringTokenizer.SplitString(source, ch: string): tstringlist;
var
temp: string;
//i: Ganzzahl;
sl: TStringList;
Index: Ganzzahl;
beginnen
wenn ch = '' dann
ch := ' ';
sl := TStringList.Create();
Ergebnis := tstringlist.Create();
sl := self.StringToCharArray(ch);
temp := '';
for Index := 1 to length(source) do // Iterate
beginnen
wenn nicht CharacterInTokens(source[index], sl), dann
beginnen
temp := temp + source[Index];
Ende
anders
beginnen
result.Add(temp);
temp := '';
Ende; //wenn
Ende; // für
if (temp <> '') then
result.Add(temp);
sl.Free;
Ende;
Funktion TSkyStringTokenizer.CharacterInTokens(ch: string;
const sl: TStringList): boolean;
var
Index: Ganzzahl;
// I: Ganzzahl;
beginnen
Ergebnis := false;
for Index := 0 to sl.Count - 1 do // Iterate
beginnen
Ergebnis := Ergebnis oder (ch = sl[Index]);
{if ch = sl[index] dann
beginnen
Ergebnis := wahr;
brechen;
Ende;
}
Ende; // für
Ende;
Destruktor TSkyStringTokenizer.destroy;
beginnen
tokens.Free;
geerbt;
Ende;
Ende.
//Das Folgende ist die C#-Version, die ursprüngliche Version wurde nicht von mir geschrieben
Verwenden des Systems;
Namespace CsharpPats
{
//String Tokenizer-Klasse
öffentliche Klasse StringTokenizer {
private Zeichenfolgendaten, Trennzeichen;
private String[]-Tokens;
privater int-Index;
public StringTokenizer(string dataLine) {
init(dataLine, " ");
}
private void init(String dataLine, string delim) {
Trennzeichen = Trennzeichen;
data = dataLine;
tokens = data.Split (delimiter.ToCharArray() );
Index = 0;
}
public StringTokenizer(string dataLine, string delim) {
init(dataLine, delim);
}
public bool hasMoreElements() {
return (index < (tokens.Length));
}
öffentlicher String nextElement() {
string s = tokens[index++];
while((s.Length <=0) && (index<tokens.Length ))
s = tokens[index++];
return s;
}
}
}