手动字符串替换(免费Pascal)

时间:2017-03-23 14:12:08

标签: pascal

我试图在不使用StringReplace的情况下替换字符串中的单词,任何想法如何?

我正在使用4个文本框。

第一个框是原始文本 第二个框是搜索词 第3个方框是替换字 第四个框是结果文本

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;  

1 个答案:

答案 0 :(得分:1)

这应该做你想要的事情:

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'和Replace ='catflap')。你能看出问题是什么,以及如何避免它?