![]() |
warum wird ein grosser text nicht korrekt durchsucht? 0_o
hi ich bins wieder mal:)
also ich habe ne textdatei, und darin will ich was best. suchen. das gute ist das was ich suche steht zwischen 2 parametern. dafuer benutze ich diesen schnipsel:
Delphi-Quellcode:
und fuer den button das:
function Between(Tag1, Tag2, Text: String): String;
begin Delete(Text,1,Pos(Tag1,Text)+length(Tag1)-1); Delete(Text,Pos(Tag2,Text),Length(Text)); Result:=Text; end;
Delphi-Quellcode:
leutz eigendlich geht das ganze auch sogar bei mir ging als ich es testete^^
procedure TForm1.Button1Click(SeTObject);
begin (Between(' Z ','?',Memo1.Text); end; nur beim test habe ich nur einen kleinen bruchteil vom gesamttext benutzt, und es klappte. eben habe ich mal kurz durchtesten wollen und habe mal den ganzen text durchsuchen gelassen und nix geht nicht! das witzige ist aber dass beim aufruf von showmessage der inhalt nicht leer war,...sondern der gesamte text der eigendlich durchsucht werden sollte war drin:( also ich find das iwi voll komisch...0_o o0o |
Re: warum wird ein grosser text nicht korrekt durchsucht? 0_
Hallo,
warum benutzt Du nicht Reguläre Ausdrücke, und arbeitest mit Lookarounds? Dort würdest Du als Lookbehind den Inhalt des Parameters Tag1 angeben, und als Lookahead den Inhalt des Parameters Tag2 und bekommst als Ergebnis das, was dazwischen steht. [Edit] Desweiteren würde ich Deine Between-Funktion so schreiben:
Delphi-Quellcode:
[/Edit]
Function Between(Tag1, Tag2, Text: String): String;
Var iPos1, iPos2, iLength: Integer; Begin iPos1 := Pos(LowerCase(Tag1), LowerCase(Text)); iPos2 := Pos(LowerCase(Tag2), LowerCase(Text)); If (iPos1 = 0) Or (iPos2 = 0) Then Begin Result := 'Tags nicht gefunden'; Exit; End; iLength := iPos2 - (iPos1 + Length(Tag1)); Result := Copy(Text, iPos1 + Length(Tag1), iLength); End; [Edit] Noch eine Abbruchbedingung eingebaut [/Edit] |
Re: warum wird ein grosser text nicht korrekt durchsucht? 0_
Zitat:
thx dass du die funktion verbessert hast:) und das problem hab ich auch schon gefunden:D ich habe meinen text ueber den stringlist editor vom memo eingefuegt per copy/paste und war davon ausgegangen dass auch alles reingeht...0o aber ich stelle grad fest dass dies garnicht der fall ist...ich kann nur 93zeilen reinkopieren und dann is auch schon schluss:D...echt dumm da haette ich wiedermal selbst draufkommen koennen^^ aber big thx fuer deine hilfe:) da o0o |
Re: warum wird ein grosser text nicht korrekt durchsucht? 0_
Zitat:
|
Re: warum wird ein grosser text nicht korrekt durchsucht? 0_
Hallo ihr beiden,
ihr müsst eure Funktionen auch noch mal testen, bevor ihr sie benutzt:
Delphi-Quellcode:
Hier noch eine Alternative:
ShowMessage(Between('m', 'u', 'marabu'));
ShowMessage(Between('m', 'u', 'marab')); ShowMessage(Between('m', 'u', 'arabu')); ShowMessage(Between('m', 'u', 'ubaram')); ![]() Grüße vom marabu |
Re: warum wird ein grosser text nicht korrekt durchsucht? 0_
Hallo marabu,,
Zitat:
Die Abbruchbedingung müsste dann so aussehen:
Delphi-Quellcode:
If ((iPos1 = 0) Or (iPos2 = 0)) or (iPos1 > iPos2) Then Begin
Result := 'Tags nicht gefunden'; Exit End; |
Re: warum wird ein grosser text nicht korrekt durchsucht? 0_
Ich habe mal eine Frage: Was ist so toll an "exit;"?
Mein ultimativer Vorschlag (xD):
Delphi-Quellcode:
PS: Wer das Case-insensetive machen will ;) baut ein paar LowerCases ein :)
function Between(AStartTag, AEndTag, AText : string) : TStringList;
var offset, startPos, endPos : Integer; begin offset := 0; Result := TStringList.Create; repeat startPos := PosEx(AStartTag, AText, offset); endPos := PosEx(AEndTag, AText, offset); if not((startPos = 0) or (endPos = 0) or (endPos <= startPos)) then begin Result.Add(Copy(AText, startPos, endPos - startPos)); offset := endPos; end; until (startPos = 0) or (endPos = 0) or (endPos <= startPos); end; PPS: HINWEIS: Teilweise sind die Tags nachher drinne ;) Ihr müsstet dann ein bisschen mit Copy spielen. |
Re: warum wird ein grosser text nicht korrekt durchsucht? 0_
Gegenfrage: was ist so schlimm an 'Exit'.
Wollen wir jetzt einen Wetbewerb veranstalten, wer die schönsten abarten der o.g. Between-Funktion präsentiert? :wall: |
Re: warum wird ein grosser text nicht korrekt durchsucht? 0_
Zitat:
Delphi-Quellcode:
da würde i = x mehr sinn machen ;)
if (i <> x) then exit;
Weil hier überprüft er ob etwas nicht ist, und führt dann exit aus. Ohne exit, überprüft er nur, ob etwas ist, und wenn nicht dann geht er an das ende der Funktion. Nagut ;) break; machen teilweise sinn:
Delphi-Quellcode:
So hat man einen Vorteil ;) Delphi kann forschleifen besser optimieren als whileschleifen ;) Und da sie nachher abgebrochen wird, wird nich unnötig zu viel gemacht :)
for i ... do
if i = x then break; MfG xZise PS: Okay, es gibt exit-Sympathisanten und exit-Gegner ;) Ich kann damit leben, versuche aber selber immer exit nicht zu verwenden. :) Lässt sich auch durchaus besser durchschauen :) Wenn "i" "x" ist, dann mache das und das :) . |
Re: warum wird ein grosser text nicht korrekt durchsucht? 0_
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:01 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 by Thomas Breitkreuz