中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > 综合其它
在Delphi中实现StringTokenizer功能模块
作者:曾青松 时间:2007-09-18 16:49 出处:互连网 责编:月夜寒箫
              摘要:在Delphi中实现StringTokenizer功能模块

unit SkyStringTokenizer;

{字符串分析处理类

}

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;

}

}

}

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有