手动字符串替换(免费帕斯卡)



我正在尝试在不使用 StringRereplace 的情况下替换字符串中的单词,知道如何吗?

我正在使用 4 个文本框。

第一个框是原文第二个框是搜索词第三个框是替换词第四个框是结果文本

var
  Form1: TForm1;
  result: string;
  rep: string;
  i, iCount: integer;  

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit4.Text := StringReplace(Edit1.Text, Edit2.Text, Edit3.Text, [rfReplaceAll, rfIgnoreCase]);
  begin
    result := Edit4.Text;
    rep := Edit3.Text;
    iCount := 0;
    for i := 1 to length(result) do
    begin
      if result[i] = rep then
        inc(iCount);
    end;
  end;
  label5.Caption := ('There was ' + IntToStr(iCount) + ' changes made');
end;  

这应该像你想要的那样做一些事情:

program mystringreplacetest;
{$mode objfpc}{$H+}
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, SysUtils;

function MyStringReplace(const Input, Find, Replace : String; out Count : Integer) : String;
var
  P : Integer;
begin
  Count := 0;
  Result := Input;
  repeat
    P := Pos(Find, Result);
    if P > 0 then begin
      Delete(Result, P, Length(Find));
      Insert(Replace, Result, P); 
      Inc(Count);
    end;
  until P = 0;
end;

var
  S : String;
  Count : Integer;
begin
  S := 'a cat another cat end';
  S := MyStringReplace(S, 'cat', 'hamster', Count);
  writeln(S, ' : ', Count);
  readln;
end.

如果这是家庭作业,我留了几件事给你做:

  • 不区分大小写

  • 避免重复扫描字符,直到第一次出现Find

显然,如果您阅读Pos函数以及DeleteInsert程序以供将来参考,那就太好了。

PS:请注意,此代码包含粗心者的陷阱。 考虑当Replace字符串包含Find字符串时会发生什么(例如,Find = 'cat' and replace = 'catflap'(。 你能看到问题是什么,以及如何避免它吗?

最新更新