StringReplace関数を使用して文字列の置換を行おうとしています。
例えば、元となる文字列が「JA=PA+N+A」で「A」を「100」に置換する時
「J100=P100+N+100」となってしまいます。「JA」を一つの単語として扱い
「A」で置換しようとしても、「JA」の「A」文字は置換されないように
したいです。置換後、「JA=PA+N+100」としたい。
どのような方法で実現することができるのでしょうか?
いろいろ調べてのですが分かりません。
'+A' を '+100' に置換するといいのでは
汎用的に使うのであれば、単語ずつ区切るように検索し、単語を置換するようにしてみてはどうでしょう。
単語区切りにするには、1文字ずつ調べる必要があります。一発でできる関数は標準ライブラリに付属していないと思います。
>汎用的に使うのであれば、単語ずつ区切るように検索し、単語を置換するようにしてみてはどうでしょう。
やってみました。
type
TWord = record
IniPos:integer;
Length:integer;
end;
TWordArray = array[0..4000] of TWord;
function IsCharInWords(ch:Char):Boolean;
const
Char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
begin
result := not (StrScan(PChar(Char),ch) = nil);
end;
function EnumWords(const Str:string; var WA:TWordArray):integer;
var
i:integer;
state:Boolean;
begin
result := 0; i := 1; state := false;
while i < Length(Str)+1 do begin
if IsCharInWords(Str[i]) then begin
if not state then begin
WA[result].IniPos := i;
state := true;
end;
end
else begin
if state then begin
WA[result].Length := i - WA[result].IniPos;
Inc(result);
state := false;
end
end;
Inc(i);
end;
if state then begin
WA[result].Length := i - WA[result].IniPos;
Inc(result);
end;
end;
procedure ExchangeWords(var Str:string;OldWord,NewWord:string);
var
WA:TWordArray;
num,i:integer;
begin
num := EnumWords(Str,WA);
for i := num-1 downto 0 do
if Copy(Str,WA[i].IniPos,WA[i].Length) = OldWord then
begin
Delete(Str,WA[i].IniPos,WA[i].Length);
Insert(NewWord,Str,WA[i].IniPos);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Str:string;
begin
Str := 'JA=PA+N+A';
ExchangeWords(Str,'A','100');
Memo1.Text := Str;
end;
jokさん、にしのさん
ありがとうございます。上手く解決できました。jokさんのソース参考にさせて
いただきました。
ツイート | ![]() |