Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi warum wird ein grosser text nicht korrekt durchsucht? 0_o (https://www.delphipraxis.net/101315-warum-wird-ein-grosser-text-nicht-korrekt-durchsucht-0_o.html)

o0o 11. Okt 2007 10:33


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:
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;
und fuer den button das:
Delphi-Quellcode:
procedure TForm1.Button1Click(SeTObject);
begin
(Between(' Z  ','?',Memo1.Text);
end;
leutz eigendlich geht das ganze auch sogar bei mir ging als ich es testete^^
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

s-off 11. Okt 2007 10:38

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:
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]

[Edit]
Noch eine Abbruchbedingung eingebaut
[/Edit]

o0o 11. Okt 2007 11:05

Re: warum wird ein grosser text nicht korrekt durchsucht? 0_
 
Zitat:

warum benutzt Du nicht Reguläre Ausdrücke, und arbeitest mit Lookarounds?
ehm joar gute frage...hab da ehrlich gesagt nich dran gedacht:)

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

s-off 11. Okt 2007 11:08

Re: warum wird ein grosser text nicht korrekt durchsucht? 0_
 
Zitat:

Zitat von o0o
thx dass du die funktion verbessert hast:)

Ich habe sie verändert - ob sie dadurch besser geworden ist, möchte ich nicht beurteilen - da gibt es sicherlich Leute, die dazu geeigneter sind :wink:

marabu 11. Okt 2007 11:14

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:
ShowMessage(Between('m', 'u', 'marabu'));
ShowMessage(Between('m', 'u', 'marab'));
ShowMessage(Between('m', 'u', 'arabu'));
ShowMessage(Between('m', 'u', 'ubaram'));
Hier noch eine Alternative: klick

Grüße vom marabu

s-off 11. Okt 2007 11:19

Re: warum wird ein grosser text nicht korrekt durchsucht? 0_
 
Hallo marabu,,
Zitat:

Zitat von marabu
ihr müsst eure Funktionen auch noch mal testen, bevor ihr sie benutzt:

Delphi-Quellcode:
ShowMessage(Between('m', 'u', 'marabu'));
ShowMessage(Between('m', 'u', 'marab'));
ShowMessage(Between('m', 'u', 'arabu'));
ShowMessage(Between('m', 'u', 'ubaram'));

bis auf das letzte Deiner Beispiele funktioniert meine Funktion doch - und das könnte man noch mittels eines Checks auf Pos1>Pos2 hinbiegen.
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;

xZise 11. Okt 2007 12:02

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:
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;
PS: Wer das Case-insensetive machen will ;) baut ein paar LowerCases ein :)

PPS: HINWEIS: Teilweise sind die Tags nachher drinne ;) Ihr müsstet dann ein bisschen mit Copy spielen.

s-off 11. Okt 2007 12:11

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:

xZise 11. Okt 2007 12:23

Re: warum wird ein grosser text nicht korrekt durchsucht? 0_
 
Zitat:

Zitat von s-off
Gegenfrage: was ist so schlimm an 'Exit'.

Naja ;) Generell sind ja goto, break und exit verpönt :) Und gerade in solchen Fällen, wo man etwas auf etwas anderes überprüft, und dass nicht so sein soll:
Delphi-Quellcode:
if (i <> x) then exit;
da würde i = x mehr sinn machen ;)
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:
for i ... do
  if i = x then
    break;
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 :)

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 :) .

Nuclear-Ping 11. Okt 2007 13:14

Re: warum wird ein grosser text nicht korrekt durchsucht? 0_
 
Zitat:

Zitat von xZise
Naja ;) Generell sind ja goto, break und exit verpönt :)

Sagt wer? Also bei goto kann ich's ja noch verstehen, aber break und exit?


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:01 Uhr.
Seite 1 von 2  1 2      

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