分享
 
 
 

在Delphi中实现StringTokenizer功能模块

王朝delphi·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

我们知道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<tokens.Length ))

s = tokens[index++];

return s;

}

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有