Delphi Tips 
-----------------------------

0325  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 2002/05/17 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 2002/05/17 osamu 編集
文字列から括弧の中のみを削除する

特に、全角の括弧と半角の括弧に対応した方法を紹介します。一旦WideStringに直しているところが味噌で、こうすることによってコードの見通しが非常に良くなります。

function DeleteInBracket(s:string):string;
const
  ZenAki = $FF08;
  ZenToji= $FF09;
  HanAki = $0028;
  HanToji= $0029;
var
  PrevPos,Len,BTimes,i:integer;
  ss:WideString;
begin
  ss := s;
  i := 1; PrevPos := 1;Len := Length(ss);BTimes := 0;
  result := '';
  while i < Len+1 do begin
    case Ord(ss[i]) of
      ZenAki,HanAki:begin
        Inc(BTimes);
        if BTimes = 1 then result := result+Copy(ss,PrevPos,i-PrevPos);
      end;
      ZenToji,HanToji:begin
        Dec(BTimes);
        if BTimes = 0 then PrevPos := i+1;
      end;
    end;
    inc(i);
    If BTimes < 0 then Break;
  end;
  if BTimes = 0 then
    result := result+Copy(ss,PrevPos,i-PrevPos)
  else if BTimes < 0 then begin
    ShowMessage('カッコが閉じていません-- ( が足りません' );
    result := result+Copy(ss,PrevPos,i-PrevPos);
  end else begin
    ShowMessage('カッコが閉じていません--  ) が足りません' );
  end;
end;

また、こういった文字列処理には正規表現を使うとかなり楽ができます。たとえば、
http://www2.big.or.jp/~osamu/Delphi/MyLibrary.htm
の BRegExp ユニットを使えば、

uses BRegExp;

function RemoveParentheses(text: string): string;
begin
  Result:= text;
  while brx.Subst('s/(\(|()[^()()]{3,1024}(\)|))//gk', Result) do;
end;

とするだけでできてしまいます。
s/// の k というオプションは、BREGEXP.DLL に固有のもので、正規表現中の SJIS を SJIS として認識してくれるので、2バイト文字にも特殊な処理はいらないです。
参照: [Delphi-ML:66865] <文字列> <PASCAL>

[新規作成] [最新の情報に更新]

How To
Lounge
KeyWords


Tips
Delphi
Home
Osamu Takeuchi osamu@big.or.jp