![]() |
Re: PosExUltra - Ultimative Stringsuche/Parser
Zitat:
Bei deiner Suche klappt sogar eine Suche nach:
Delphi-Quellcode:
und:
">
Delphi-Quellcode:
obwohl
</a></td>
Delphi-Quellcode:
SEHR häufig vorkommt.
">
Ausserdem scheint deine Funktion schneller zu sein, als meine, weniger Code ist es auf jedenfall. Respekt und danke! Mfg Novo |
Re: PosExUltra - Ultimative Stringsuche/Parser
Gibt es einen bestimmten Grund, warum Du
Delphi-Quellcode:
verwendest und nicht
procedure ExtractBetween(const aSource, aPrefix, aSuffix : string;
aFindAll : Boolean; aNewPrefix, aNewSuffix : string; aWords : TStrings);
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:
umsezen. In diesem Fall bräuchte man aFindAll nur dann zu übergeben, wenn nur der erste Treffer zurückgegeben werden soll.
procedure ExtractBetween(const aSource, aPrefix, aSuffix : string;
const aNewPrefix, aNewSuffix : string; var aWords : TStrings; const aFindAll : Boolean = True); Um das ganze richtig elegant zu machen, würde ich das ganze so umbauen:
Delphi-Quellcode:
dann kann man sich den Parameter aWords nämlich komplett sparen :wink:
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; |
Re: PosExUltra - Ultimative Stringsuche/Parser
Hallo Heiko,
Zitat:
Gruß Hawkeye |
Re: PosExUltra - Ultimative Stringsuche/Parser
Zitat:
|
Re: PosExUltra - Ultimative Stringsuche/Parser
Richtig. Ich selbst deklariere übergebene Objekte immer als const, damit ich mir nicht versehentlich "ins Knie schieße", indem ich die Referenz ändere.
|
Re: PosExUltra - Ultimative Stringsuche/Parser
Übrigens musst du bei Objektreferenzen kein var davor schreiben.
Du bekommst ja quasi einen Pointer auf die Stringliste und den änderst du ja nicht, also kein Grund für var ;) Und wie bereits gesagt wurde ist const sogar angebrachter. MfG Fabian |
Re: PosExUltra - Ultimative Stringsuche/Parser
Zitat:
Ausserdem geht das nichtmal:
Delphi-Quellcode:
Bei:
ListBox1.Items.AddStrings(FuncExtractBetween(source, '[img]', '[/img]</img>', '', '', True));
Code:
mal alle album links ziehn.
<img src="http://blub.de
" alt="album"></img> <img src="http://blub.de " alt="bild"></img> <img src="http://blub.de " alt="bild"></img> <img src="http://blub.de " alt="album"></img> <img src="http://blub.de " alt="album"></img> <img src="http://blub.de " alt="bild"></img> <img src="http://blub.de " alt="album"></img> öhm und ist die rückwärtssuche nun wirklich überflüssig? |
Re: PosExUltra - Ultimative Stringsuche/Parser
Jau, das mit der direkten Zuweisung der TStrings als Funktionsrückgabe funktioniert wirklich nicht.
Beim ersten Zugriff auf Results in der Funktion (z.B. durch Results.Beginupdate oder .Append) kommt eine Read/write access exception. Weiss jemand, warum das nicht geht und ob es da einen Trick gibt? |
Re: PosExUltra - Ultimative Stringsuche/Parser
Das dürfte daran liegen, dass Result nirgends erzeugt wird. Aber wie bereits weiter oben gesagt sollte man das Objekt besser an die Routine übergeben, sonst fängt man sich schnell ein Speicherleck ein.
|
Re: PosExUltra - Ultimative Stringsuche/Parser
Moin,
naja wo ist denn das Objekt erstellt worden? Vorgesehen war es eigentlich das dies außerhalb passiert, aber wenn die nun zurückgegeben wird, musst du es wohl in der Funktion erstellen. Allerdings gewöhne dir das lieber nicht an, weil das ist nicht gerade sauberer Stil. Es stellt sich nämlich die Frage, wo wird das denn wieder freigegeben? Bei der ursprünglichen Version war das klar:
Delphi-Quellcode:
Bei der veränderten Fassung, kannst du das nicht mehr so strikt trennen. Deshalb ist der Trick, nimm die Fassung von omata (oder?):
var
o : TObject; begin o := TObject.Create; try func(o); // do sth. finally o.Free; end;
Delphi-Quellcode:
Nebenbei, wenn der letzte Parameter ein var-Parameter wäre, geht das glaub ich nicht, weil TCustomMemo.Lines eine Property ist.
ExtractBetween(…, Memo.Lines);
MfG Fabian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz