科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件在Delphi中实现StringTokenizer功能模块

在Delphi中实现StringTokenizer功能模块

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Java中有StringTokenizer,对于字符串处理都非常的方便,但是Delphi中没有提供该功能,本文作者参考Java语言实现此功能的Delphi版本和C#版本。

作者:曾青松 来源:曾青松 2007年9月15日

关键字: 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;

}

}

}

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章