Java には文字列処理に便利な StringTokenizer があるのは知っていますが、Delphi にはこの機能がありませんので、この機能を実装するために Delphi 版と C# 版の Java 言語を参照しました。利便性を提供したいと考えています。さらにアドバイスをいただければ幸いです。 [email protected]
ユニット SkyStringTokenizer;
{文字列解析および処理クラス
著者: 曽慶松
日時: 2004/2/21 (2003年大晦日)
}
インタフェース
用途
SysUtils、クラス。
タイプ
IIterator = インターフェース
関数 hasNext(): ブール値;
関数 next(): 文字列;
終わり;
タイプ
TskyStringTokenizer = クラス(TComponent, IIterator)
プライベート
トークン: TStringList;
インデックス: 整数;
データ: 文字列;
区切り文字: 文字列;
プロシージャ init(dataLine: 文字列; delim: 文字列);
関数 CharacterInTokens(ch: 文字列; const sl: TStringList): ブール値;
関数 StringToCharArray(delim: string): TStringList;
関数 SplitString(source, ch: string): Tstringlist;
保護された
{ 保護された宣言 }
公共
{公的宣言}
コンストラクター作成(dataLine:文字列);
コンストラクター Create(dataLine: 文字列; delim: 文字列);
デストラクタ destroy();オーバーライド;
関数 hasNext(): ブール値;
関数 next(): 文字列;
出版された
{ 公開された宣言 }
終わり;
手順 登録;
実装
手順 登録;
始める
RegisterComponents('SkyDevKit', [TSkyStringTokenizer]);
終わり;
{ TStringTokenizer }
関数 TskyStringTokenizer.hasNext: ブール値;
始める
結果 := (インデックス < トークン数 - 1);
終わり;
プロシージャ TSkyStringTokenizer.init(dataLine, delim: string);
始める
トークン := TStringList.Create();
区切り文字 := 区切り文字;
データ := データライン;
トークン := SplitString(データ, 区切り文字);
//トークン := data.Split(delimiter.ToCharArray());
インデックス := -1;
終わり;
関数 TskyStringTokenizer.next: 文字列;
変数
s: 文字列;
始める
inc(インデックス);
s := トークン[インデックス];
while ((length(s) <= 0) and (index < tokens.Count)) は実行します
始める
inc(インデックス);
s := トークン[インデックス];
終わり;
結果 := s;
終わり;
関数 TskyStringTokenizer.StringToCharArray(delim: string): TStringList;
変数
sl: TStringList;
I: 整数。
始める
sl := TStringList.Create();
for I := 1 to length(delim) do // 反復処理
始める
sl.Append(copy(delim, i, 1));
// 終了;
結果 := sl;
終わり;
コンストラクター TskyStringTokenizer.Create(dataLine, delim: string);
始める
継承された Create(nil);
self.init(dataLine, delim);
終わり;
コンストラクター TskyStringTokenizer.Create(dataLine: string);
始める
継承された Create(nil);
self.init(dataLine, ' ');
終わり;
関数 TskyStringTokenizer.SplitString(source, ch: string): tstringlist;
変数
一時: 文字列;
//i: 整数;
sl: TStringList;
インデックス: 整数;
始める
ch = ''の場合、
ch := ' ';
sl := TStringList.Create();
結果 := tstringlist.Create();
sl := self.StringToCharArray(ch);
温度:= '';
for Index := 1 to length(source) do // 反復処理
始める
CharacterInTokens(source[index], sl) ではない場合
始める
temp := temp + ソース[インデックス];
終わり
それ以外
始める
result.Add(一時);
温度:= '';
終了; //場合
// 終了;
if (temp <> '') then
result.Add(一時);
sl.無料。
終わり;
関数 TskyStringTokenizer.CharacterInTokens(ch: 文字列;
const sl: TStringList): ブール値;
変数
インデックス: 整数;
// I: 整数;
始める
結果:= false;
for Index := 0 to sl.Count - 1 do // 反復します
始める
result := result or (ch = sl[Index]);
{if ch = sl[インデックス] then
始める
結果:= true;
壊す;
終わり;
}
// 終了;
終わり;
デストラクターTSkyStringTokenizer.destroy;
始める
トークン。無料。
継承された。
終わり;
終わり。
//以下は C# バージョンです。初期バージョンは私が書いたものではありません
システムを使用する;
名前空間 CsharpPats
{
//文字列トークナイザークラス
パブリック クラス StringTokenizer {
プライベート文字列データ、区切り文字。
プライベート文字列[]トークン。
プライベート int インデックス。
public StringTokenizer(string dataLine) {
init(dataLine, " ");
}
private void init(String dataLine, string delim) {
デリミタ = デリミタ;
データ = データライン;
トークン = data.Split (delimiter.ToCharArray() );
インデックス = 0;
}
public StringTokenizer(string dataLine, string delim) {
init(dataLine, delim);
}
public bool hasMoreElements() {
return (インデックス < (tokens.Length));
}
パブリック文字列 nextElement() {
文字列 s = トークン[index++];
while((s.Length <=0) && (index<tokens.Length ))
s = トークン[index++];
を返します。
}
}
}