Java에는 문자열 처리에 매우 편리한 StringTokenizer가 있다는 것을 알고 있지만 Delphi에서는 이 기능을 제공하지 않습니다. 이 기능을 구현하기 위해 Java 언어의 Delphi 버전과 C# 버전을 참조합니다. 편의를 제공해 주시길 바랍니다. 나에게 더 많은 조언을 해주실 수 있기를 바랍니다. [email protected]
단위 SkyStringTokenizer;
{문자열 분석 및 처리 수업
저자: 젱칭송
시간: 2004년 2월 21일(2003년 섣달 그믐날)
}
인터페이스
용도
SysUtils, 클래스;
유형
IIterator = 인터페이스
함수 hasNext(): 부울;
함수 next(): 문자열;
끝;
유형
TskyStringTokenizer = 클래스(TComponent, IIterator)
사적인
토큰: TStringList;
인덱스: 정수;
데이터: 문자열;
구분 기호: 문자열;
프로시저 init(dataLine: 문자열; delim: 문자열);
function CharacterInTokens(ch: 문자열; const sl: TStringList): 부울;
function StringToCharArray(delim: string): TStringList;
function SplitString(source, ch: string): Tstringlist;
보호됨
{ 보호된 선언 }
공공의
{공개 선언}
생성자 생성(dataLine: 문자열);
생성자 Create(dataLine: 문자열; 구분: 문자열);
소멸자 destroy();재정의;
함수 hasNext(): 부울;
함수 next(): 문자열;
출판됨
{ 게시된 선언 }
끝;
절차 등록;
구현
절차 등록;
시작하다
RegisterComponents('SkyDevKit', [TSkyStringTokenizer]);
끝;
{ TStringTokenizer }
함수 TskyStringTokenizer.hasNext: 부울;
시작하다
결과 := (index < tokens.Count - 1);
끝;
절차 TskyStringTokenizer.init(dataLine, delim: string);
시작하다
토큰 := TStringList.Create();
구분 기호 := delim;
데이터 := 데이터라인;
토큰 := SplitString(데이터, 구분 기호);
//토큰 := data.Split(delimiter.ToCharArray());
인덱스 := -1;
끝;
함수 TskyStringTokenizer.next: 문자열;
var
s: 문자열;
시작하다
inc(인덱스);
s := 토큰[색인];
while ((length(s) <= 0) and (index < tokens.Count)) do
시작하다
inc(인덱스);
s := 토큰[색인];
끝;
결과 := s;
끝;
함수 TskyStringTokenizer.StringToCharArray(delim: string): TStringList;
var
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;
var
온도: 문자열;
//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)가 아닌 경우
시작하다
온도 := 온도 + 소스[인덱스];
끝
또 다른
시작하다
결과.추가(임시);
온도 := '';
종료; //만약
끝;
if (temp <> '') 그러면
결과.추가(임시);
sl.무료;
끝;
함수 TskyStringTokenizer.CharacterInTokens(ch: 문자열;
const sl: TStringList): 부울;
var
인덱스: 정수;
// 나: 정수;
시작하다
결과 := 거짓;
for Index := 0 to sl.Count - 1 do // 반복
시작하다
result := 결과 또는 (ch = sl[Index]);
{if ch = sl[index]이면
시작하다
결과 := 참;
부서지다;
끝;
}
끝;
끝;
소멸자 TskyStringTokenizer.destroy;
시작하다
토큰.무료;
상속됨;
끝;
끝.
//다음은 C# 버전이며, 초기 버전은 제가 작성한 것이 아닙니다.
시스템 사용;
네임스페이스 CsharpPats
{
//문자열 토크나이저 클래스
공개 클래스 StringTokenizer {
개인 문자열 데이터, 구분 기호;
개인 문자열[] 토큰;
비공개 int 인덱스;
공개 StringTokenizer(문자열 데이터라인) {
init(dataLine, " ");
}
private void init(String dataLine, string delim) {
구분 기호 = 구분 기호;
데이터 = 데이터라인;
토큰 = data.Split (delimiter.ToCharArray() );
인덱스 = 0;
}
public StringTokenizer(string dataLine, string delim) {
init(dataLine, delim);
}
공공 bool hasMoreElements() {
return (index < (tokens.Length));
}
공개 문자열 nextElement() {
문자열 s = 토큰[index++];
while((s.Length <=0) && (index<tokens.Length ))
s = 토큰[index++];
반환 s;
}
}
}