Показать сообщение отдельно
  #8  
Старый 09.12.2016, 00:50
Аватар для @Rafa3L
@Rafa3L @Rafa3L вне форума
Начинающий
 
Регистрация: 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;
__________________
Помогаю платно.
Помогаю иногда бесплатно.
Ответить с цитированием