我正在尝试在不使用 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
函数以及Delete
和Insert
程序以供将来参考,那就太好了。
PS:请注意,此代码包含粗心者的陷阱。 考虑当Replace
字符串包含Find
字符串时会发生什么(例如,Find = 'cat' and replace = 'catflap'(。 你能看到问题是什么,以及如何避免它吗?