我试图在不使用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;
答案 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
函数以及Delete
和Insert
程序以供将来参考,那将是一件好事。
PS:请注意,此代码包含一个不谨慎的陷阱。考虑当Replace
字符串包含Find
字符串时发生的情况(例如Find ='cat'和Replace ='catflap')。你能看出问题是什么,以及如何避免它?