文字列置換

解決


リュウ  2004-10-05 05:58:01  No: 11272

StringReplace関数を使用して文字列の置換を行おうとしています。
例えば、元となる文字列が「JA=PA+N+A」で「A」を「100」に置換する時
「J100=P100+N+100」となってしまいます。「JA」を一つの単語として扱い
「A」で置換しようとしても、「JA」の「A」文字は置換されないように
したいです。置換後、「JA=PA+N+100」としたい。
どのような方法で実現することができるのでしょうか?
いろいろ調べてのですが分かりません。


jok  2004-10-05 17:24:36  No: 11273

'+A' を '+100' に置換するといいのでは


にしの  2004-10-05 18:37:58  No: 11274

汎用的に使うのであれば、単語ずつ区切るように検索し、単語を置換するようにしてみてはどうでしょう。
単語区切りにするには、1文字ずつ調べる必要があります。一発でできる関数は標準ライブラリに付属していないと思います。


jok  2004-10-06 01:14:27  No: 11275

>汎用的に使うのであれば、単語ずつ区切るように検索し、単語を置換するようにしてみてはどうでしょう。

やってみました。

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;


リュウ  2004-10-06 07:09:27  No: 11276

jokさん、にしのさん

ありがとうございます。上手く解決できました。jokさんのソース参考にさせて
いただきました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加