文字列から括弧の中のみを削除する
|
特に、全角の括弧と半角の括弧に対応した方法を紹介します。一旦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バイト文字にも特殊な処理はいらないです。 |
|