指定文字をTrimする関数
|
44 |
TrimChar |
動作確認 |
Delphi2007 |
更新日 |
2008/01/28(月) |
文字列処理をしている際に指定文字だけをTrimしたい場合がよくありますので
関数を作っておきます。
────────────────────
{-------------------------------
//指定文字をトリム
TrimLeftChar
TrimRightChar
TrimChar
引数説明: S: トリム対象
Table: トリムしたい文字列テーブル
備考: SとTableに指定する文字列は
全角文字やEmptyStrに対応している。
履歴: 2001/10/15
2003/06/29
高速化
//------------------------------}
const
EmptyStr: WideString = '';
function TrimLeftChar(S: WideString; Table: WideString): WideString;
var
i: Integer;
WriteIndex: Integer;
TrimFlag: Boolean;
begin
SetLength(Result, Length(S));
WriteIndex := 0;
TrimFlag := True;
for i := 1 to Length(S) do
begin
if not (TrimFlag and (1<=Pos(S[i], Table))) then
begin
TrimFlag := False;
Inc(WriteIndex);
Result[WriteIndex] := S[i];
end;
end;
SetLength(Result, WriteIndex);
{ -----------------------------------
//低速だがコードが短い方の実装
begin
while (S<>EmptyStr) and (1<=Pos(S[1], Table)) do
Delete(S, 1, 1);
Result := S;
end;
//----------------------------------- }
end;
function TrimRightChar(S: WideString; Table: WideString): WideString;
var
i: Integer;
WriteIndex: Integer;
begin
Result := S;
WriteIndex := Length(Result);
for i := Length(S) downto 1 do
begin
if (1<=Pos(S[i], Table)) then
begin
Dec(WriteIndex);
end else
begin
break;
end;
end;
SetLength(Result, WriteIndex);
{ -----------------------------------
//低速だがコードが短い方の実装
begin
while (S<>EmptyStr) and (1<=Pos(S[Length(S)], Table)) do
Delete(S, Length(S), 1);
Result := S;
end;
//----------------------------------- }
end;
function TrimChar(S: WideString; Table: WideString): WideString;
begin
Result := TrimLeftChar(TrimRightChar(S, Table), Table);
end;
procedure testTrimLeftChar;
begin
Check('あ', TrimLeftChar(' あ', ' '));
Check('う', TrimLeftChar(' う', ' '));
Check('か', TrimLeftChar('あいうえおああいいか', 'あいうえお'));
Check('X', TrimLeftChar(' YY X', ' Y'));
Check('789', TrimLeftChar('012346789', '6543210'));
Check('ABCXYZ', TrimLeftChar('XXYYZZABCXYZ', 'XYZ'));
Check('', TrimLeftChar('XXYYZZABCXYZ', 'XYZABC'));
Check('AAA'#9, TrimLeftChar(#9'AAA'#9, #9));
Check(#9, TrimLeftChar('AAA'#9, 'A'));
Check(#9'AAA', TrimLeftChar(#13#10#9'AAA', #13#10));
Check(#13#10, TrimLeftChar(#9'AAA'#13#10, #9'A'));
Check('123', TrimLeftChar('123', ''));
end;
procedure testTrimRightChar;
begin
Check(' ', TrimRightChar(' あ', 'あ'));
Check('あいうえお', TrimRightChar('あいうえおああいいか', 'かいあ'));
Check('う', TrimRightChar('う ', ' '));
Check(' YY', TrimRightChar(' YY X', ' X'));
Check('012', TrimRightChar('012346789', '346789'));
Check('XXYYZZABC', TrimRightChar('XXYYZZABCXYZ', 'XYZ'));
Check('', TrimRightChar('XXYYZZABCXYZ', 'XYZABC'));
Check(#9'AAA', TrimRightChar(#9'AAA'#9, #9));
Check(#9, TrimRightChar(#9'AAA', 'A'));
Check(#9'AAA', TrimRightChar(#9'AAA'#13#10, #13#10));
Check(#13#10, TrimRightChar(#13#10#9'AAA', #9'A'));
Check('123', TrimRightChar('123', ''));
end;
procedure testTrimChar;
begin
Check('ABC', TrimChar('123467829ABC5212694192', '0123456789'));
Check('', TrimChar('123467829ABC5212694192', 'ABC0123456789'));
Check('かきくけこ', TrimChar('あいうえああいいかきくけこおおえういあい', 'あいうえお'));
Check('AAA', TrimChar(#9'AAA'#9, #9));
Check(#9, TrimChar(#9'AAA', 'A'));
Check(#9'AAA', TrimChar(#9'AAA'#13#10, #13#10));
Check(#13#10, TrimChar(#9'AAA'#13#10, #9'A'));
Check('123', TrimChar('123', ''));
end;
//------------------------------
────────────────────
全角を含めた文字列に対してTableで指定した文字でトリムします
WideStringで処理していて
半角文字、全角文字、制御文字などに対応しています。
テストコードも含めました。
動作結果に疑問がある場合はこれを使ってデバッグしてください。
参考────────────────────
Borland - Delphi Q&A 文字列操作に関する関数は,Delphi で提供される他にないのですか?
http://www.borland.co.jp/qanda/delphi/d0002815.html
※制御文字かどうかを判断するのはS[i]<' 'というコードになるらしい。
|