指定文字を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]<' 'というコードになるらしい。