09.12.2016, 00:50
|
|
Начинающий
|
|
Регистрация: 09.11.2011
Адрес: Москва
Сообщения: 144
Версия Delphi: XE2
Репутация: 11216
|
|
2 lmikle Что ж ты тогда флаги не отработал, при таком-то педантиизмие :-)
Дело Принципа - стрелять, и "Если уж делать, то как-то так":
Код:
function MyStringReplace(S, OldPattern, NewPattern: string;
Flags: TReplaceFlags = [rfReplaceAll]): string;
var
UpperFindStr: string;
pS: PChar;
i, j, Idx: integer;
IsEqual, CanReplace: bool;
begin
if OldPattern = '' then
begin
Result:= S;
Exit;
end;
Result:= '';
if S = '' then Exit;
if rfIgnoreCase in Flags then
begin
OldPattern:= AnsiUpperCase(OldPattern);
UpperFindStr:= AnsiUpperCase(S);
pS:= PChar(UpperFindStr);
end else pS:= PChar(s);
if Length(OldPattern) >= Length(NewPattern) then
SetLength(Result,Length(s)) else
SetLength(Result,(Length(s)+Length(OldPattern)+Length(NewPattern))*2);
i:= 1;
Idx:= 0;
CanReplace:= true;
while i <= Length(s) do
begin
IsEqual:= false;
if CanReplace then
begin
if pS[i-1] = OldPattern[1] then
begin
IsEqual:= true;
for j := 2 to Length(OldPattern) do
begin
if pS[i+j-2] <> OldPattern[j] then
begin
IsEqual:= false;
Break;
end;
end;
if IsEqual then
begin
for j := 1 to Length(NewPattern) do
begin
Inc(Idx);
if Idx > Length(Result) then
SetLength(Result,Length(Result)*2);
Result[Idx]:= NewPattern[j];
end;
Inc(i, Length(OldPattern));
if not (rfReplaceAll in Flags) then
CanReplace:= false;
end;
end;
end;
if not IsEqual then
begin
Inc(Idx);
if Idx > Length(Result) then
SetLength(Result,Length(Result)*2);
Result[Idx] := S[i];
Inc(i);
end;
end;
SetLength(Result, Idx);
end;
__________________
Помогаю платно.
Помогаю иногда бесплатно.
|