我们知道Java中有StringTokenizer,对于字符串处理都非常的方便,但是Delphi中没有提供该功能,我参考Java语言实现此功能的Delphi版本和C#版本。希望给大家提供一个方便。希望多多指教。zengqingsong@sohu.com unit SkyStringTokenizer; {字符串分析处理类 作者:曾青松 时间:2004/2/21(2003年除夕) } interface uses SysUtils, Classes; type IIterator = interface function hasNext(): boolean; function next(): string; end; type TSkyStringTokenizer = class(TComponent, IIterator) private tokens: TStringList; index: integer; data: string; delimiter: string; 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; protected { Protected declarations } public { Public declarations } constructor create(dataLine: string); overload; constructor Create(dataLine: string; delim: string); overload; destructor destroy();override; function hasNext(): boolean; function next(): string; published { Published declarations } end; procedure Register; implementation procedure Register; begin RegisterComponents('SkyDevKit', [TSkyStringTokenizer]); end; { TStringTokenizer } function TSkyStringTokenizer.hasNext: boolean; begin result := (index < tokens.Count - 1); end; procedure TSkyStringTokenizer.init(dataLine, delim: string); begin tokens := TStringList.Create(); delimiter := delim; data := dataLine; tokens := SplitString(data, delimiter); //tokens := data.Split(delimiter.ToCharArray()); index := -1; end; function TSkyStringTokenizer.next: string; var s: string; begin inc(index); s := tokens[index]; while ((length(s) <= 0) and (index < tokens.Count)) do begin inc(index); s := tokens[index]; end; result := s; end; function TSkyStringTokenizer.StringToCharArray(delim: string): TStringList; var sl: TStringList; I: Integer; begin sl := TStringList.Create(); for I := 1 to length(delim) do // Iterate begin sl.Append(copy(delim, i, 1)); end; // for result := sl; end; constructor TSkyStringTokenizer.Create(dataLine, delim: string); begin inherited Create(nil); self.init(dataLine, delim); end; constructor TSkyStringTokenizer.Create(dataLine: string); begin inherited Create(nil); self.init(dataLine, ' '); end; function TSkyStringTokenizer.SplitString(source, ch: string): tstringlist; var temp: string; //i: integer; sl: TStringList; index: integer; begin if ch = '' then ch := ' '; sl := TStringList.Create(); result := tstringlist.Create(); sl := self.StringToCharArray(ch); temp := ''; for Index := 1 to length(source) do // Iterate begin if not CharacterInTokens(source[index], sl) then begin temp := temp + source[Index]; end else begin result.Add(temp); temp := ''; end; //if end; // for if (temp <> '') then result.Add(temp); sl.Free; end; function TSkyStringTokenizer.CharacterInTokens(ch: string; const sl: TStringList): boolean; var index: integer; // I: Integer; begin result := false; for Index := 0 to sl.Count - 1 do // Iterate begin result := result or (ch = sl[Index]); {if ch = sl[index] then begin result := true; break; end; } end; // for end; destructor TSkyStringTokenizer.destroy; begin tokens.Free ; inherited; end; end. //下面是C#版本,最初版本不是我写的 using System; namespace CsharpPats { //String Tokenizer class public class StringTokenizer { private string data, delimiter; private string[] tokens; private int index; public StringTokenizer(string dataLine) { init(dataLine, " "); } private void init(String dataLine, string delim) { delimiter = delim; 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)); } public string nextElement() { string s = tokens[index++]; while((s.Length <=0) && (index s = tokens[index++]; return s; } } } |