Einzelnen Beitrag anzeigen

Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#22

Re: PosExUltra - Ultimative Stringsuche/Parser

  Alt 25. Feb 2010, 10:51
Gibt es einen bestimmten Grund, warum Du
Delphi-Quellcode:
procedure ExtractBetween(const aSource, aPrefix, aSuffix : string;
                         aFindAll : Boolean; aNewPrefix, aNewSuffix : string;
                         aWords : TStrings);
verwendest und nicht
Delphi-Quellcode:
procedure ExtractBetween(const aSource, aPrefix, aSuffix : string;
                         const aFindAll : Boolean; const aNewPrefix, aNewSuffix : string;
                         var aWords : TStrings);
?

Da bei keinem der Parameter eine Wertzuweisung stattfindet, kann man sie ohne Probleme auch alle als Konstanten deklarieren, mit Ausnahme vom aWords. Der muss als Var-Parameter deklariert werden, da ja dort die Ergebnisse gespeichert werden.

Man könnte das ganze auch noch eleganter mittels
Delphi-Quellcode:
procedure ExtractBetween(const aSource, aPrefix, aSuffix : string;
                         const aNewPrefix, aNewSuffix : string;
                         var aWords : TStrings; const aFindAll : Boolean = True);
umsezen. In diesem Fall bräuchte man aFindAll nur dann zu übergeben, wenn nur der erste Treffer zurückgegeben werden soll.

Um das ganze richtig elegant zu machen, würde ich das ganze so umbauen:
Delphi-Quellcode:
function ExtractBetween(const aSource, aPrefix, aSuffix, aNewPrefix, aNewSuffix : string;
                         const aFindAll : Boolean = True): TStrings;
var
  PrefixLength, PosPrefix, PosSuffix, BestPos : Integer;
begin
  PosPrefix := PosEx(aPrefix, aSource, 1);

  if (PosPrefix > 0) then
  begin
    PrefixLength := Length (aPrefix);

    repeat
      PosSuffix := PosEx(aSuffix, aSource, PosPrefix + PrefixLength);

      if (PosSuffix > 0) then
      begin
        while (PosPrefix <> 0) and (PosPrefix < PosSuffix) do
        begin
          BestPos := PosPrefix;
          PosPrefix := PosEx(aPrefix, aSource, PosPrefix + PrefixLength);
        end;

        Result.Append(
            aNewPrefix
          + Copy(aSource, BestPos + PrefixLength, PosSuffix-BestPos - PrefixLength)
          + aNewSuffix
        );
      end;
    until not aFindall or (PosSuffix = 0) or (PosPrefix = 0);
  end;
end;
dann kann man sich den Parameter aWords nämlich komplett sparen
Jeder kann ein Held werden und Leben retten!
Einfach beim NKR oder der DKMS als Stammzellenspender registrieren! Also: worauf wartest Du noch?
  Mit Zitat antworten Zitat