AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi PosExUltra - Ultimative Stringsuche/Parser

PosExUltra - Ultimative Stringsuche/Parser

Ein Thema von Novo · begonnen am 21. Feb 2010 · letzter Beitrag vom 19. Mai 2010
Antwort Antwort
Seite 3 von 5     123 45   
Novo

Registriert seit: 27. Mai 2007
122 Beiträge
 
Delphi 7 Enterprise
 
#21

Re: PosExUltra - Ultimative Stringsuche/Parser

  Alt 23. Feb 2010, 10:47
Zitat von omata:
Ups, ja ihr habt recht, danke für die Hinweise.
Hier die Korrektur...
Ich bin schwer beeindruckt!
Bei deiner Suche klappt sogar eine Suche nach: "> und: </a></td> obwohl "> SEHR häufig vorkommt.
Ausserdem scheint deine Funktion schneller zu sein, als meine, weniger Code ist es auf jedenfall.

Respekt und danke!


Mfg Novo
Takeo
Don't make me angry...
You wouldn't like me when I'm angry!
Blut ist leben, Leben ist Blut, ins Licht geboren suchen wir die Dunkelheit!
  Mit Zitat antworten Zitat
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
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#23

Re: PosExUltra - Ultimative Stringsuche/Parser

  Alt 25. Feb 2010, 11:34
Hallo Heiko,

Zitat von HeikoAdams:
dann kann man sich den Parameter aWords nämlich komplett sparen
Und wer erzeugt die Stringliste dann? Wie möchtest du das Ergebnis beispielsweise einem Memo zuweisen? In solchen Fällen gibt es eine feste Regel, an die man sich halten sollte: Der Aufrufer muss eine Stringliste bereitstellen, die von der Routine gefüllt wird. Er ist es auch, der die Stringliste wieder freigeben muss. Jede andere Vorgehensweise wird früher oder später zu einem Problem führen.

Gruß Hawkeye
  Mit Zitat antworten Zitat
schlecki

Registriert seit: 11. Apr 2005
Ort: Darmstadt
148 Beiträge
 
Delphi XE2 Enterprise
 
#24

Re: PosExUltra - Ultimative Stringsuche/Parser

  Alt 25. Feb 2010, 11:48
Zitat von HeikoAdams:
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.
Meiner Meinung nach, kann auch aWords als const deklariert werden. Du willst ja keine andere Liste zuweisen, sondern nur ihre Werte ändern. Das sollte auch so gehen.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.252 Beiträge
 
Delphi 10.4 Sydney
 
#25

Re: PosExUltra - Ultimative Stringsuche/Parser

  Alt 25. Feb 2010, 11:51
Richtig. Ich selbst deklariere übergebene Objekte immer als const, damit ich mir nicht versehentlich "ins Knie schieße", indem ich die Referenz ändere.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#26

Re: PosExUltra - Ultimative Stringsuche/Parser

  Alt 25. Feb 2010, 12:56
Ü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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Novo

Registriert seit: 27. Mai 2007
122 Beiträge
 
Delphi 7 Enterprise
 
#27

Re: PosExUltra - Ultimative Stringsuche/Parser

  Alt 25. Feb 2010, 18:33
Zitat von HeikoAdams:
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;
dann kann man sich den Parameter aWords nämlich komplett sparen
Keine gute idee, daraus ne funktion zu machen.
Ausserdem geht das nichtmal:
      ListBox1.Items.AddStrings(FuncExtractBetween(source, '[img]', '[/img]</img>', '', '', True)); Bei:
Code:
<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>
mal alle album links ziehn.
öhm und ist die rückwärtssuche nun wirklich überflüssig?
Takeo
Don't make me angry...
You wouldn't like me when I'm angry!
Blut ist leben, Leben ist Blut, ins Licht geboren suchen wir die Dunkelheit!
  Mit Zitat antworten Zitat
Benutzerbild von GPRSNerd
GPRSNerd

Registriert seit: 30. Dez 2004
Ort: Ruhrpott
230 Beiträge
 
Delphi 10.3 Rio
 
#28

Re: PosExUltra - Ultimative Stringsuche/Parser

  Alt 26. Feb 2010, 09:57
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?
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.252 Beiträge
 
Delphi 10.4 Sydney
 
#29

Re: PosExUltra - Ultimative Stringsuche/Parser

  Alt 26. Feb 2010, 10:02
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#30

Re: PosExUltra - Ultimative Stringsuche/Parser

  Alt 26. Feb 2010, 10:07
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:
var
  o : TObject;
begin
  o := TObject.Create;
  try
    func(o);
    // do sth.
  finally
    o.Free;
  end;
Bei der veränderten Fassung, kannst du das nicht mehr so strikt trennen. Deshalb ist der Trick, nimm die Fassung von omata (oder?):
ExtractBetween(…, Memo.Lines); Nebenbei, wenn der letzte Parameter ein var-Parameter wäre, geht das glaub ich nicht, weil TCustomMemo.Lines eine Property ist.

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 00:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf