Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi String nach Muster durchsuchen (https://www.delphipraxis.net/135898-string-nach-muster-durchsuchen.html)

Linguini 19. Jun 2009 19:18


String nach Muster durchsuchen
 
Hallo,

ich will große Textmengen nach bestimmten Mustern durchsuchen. Diese Muster kommen allerdings mehrmals vor.
Aufbau:

FesterTeil|VeränderlicherTeil|FesterTeil

Wie durchsuch ich nun die Textdatei bzw. den String am effektivsten nach diesen Mustern?
Mit copy+ansipos ist es ziemlich mühsam.

Gibt es eine andere Möglichkeit bzw. sogar eine eigene Unit?

Danke

mkinzler 19. Jun 2009 19:32

Re: String nach Muster durchsuchen
 
[dp]Reguläre Ausdrücke[/dp]

Fridolin Walther 19. Jun 2009 19:44

Re: String nach Muster durchsuchen
 
Ich glaub Reguläre Ausdrücke wären in dem Fall fast Overkill. Was er will, ist wenn ich richtig Verstanden habe, eine simple Stringsuche mit Wildcards. Der verlinkte Thread bietet übrigens nicht eine, sondern gleich mehrere verschiedene Implementationen für das besagte Problem an. Such Dir eine aus ;).

[offtopic]Ich hoffe übrigens Du willst mit der Funktion nicht in einer in einem String eingelesenen Executable suchen ... und ja das ist ein Seitenhieb weil ich da immer noch nicht drauf klar komm :P.[/offtopic]

himitsu 19. Jun 2009 20:21

Re: String nach Muster durchsuchen
 
im Notfall könnte man auch einfach PosEx+Copy nutzen :angel:

alzaimar 19. Jun 2009 20:27

Re: String nach Muster durchsuchen
 
Zitat:

Zitat von 0xF30FC7
Ich glaub Reguläre Ausdrücke wären in dem Fall fast Overkill.

Echt? Das ist doch ein Standardwerkzeug zum Durchsuchen großer Text-Dateien, z.B. Logdateien, Fehlerlisten u.ä.

Linguini 20. Jun 2009 07:31

Re: String nach Muster durchsuchen
 
@mkinzler Ich werde mich mal in RegEx einlesen, scheint ja ein recht umfangreichen, kompliziertes Thema zu sein. Danke.

@0xF30FC7

Nein ich will keine Dateistrings durchsuchen ;)
In dem Thread habe ich leider nur Möglichkeiten gefunden, ob dieser String existiert, ich suche aber etwas das mir die Position bzw. gleich den ganzen String zurückgibt.

himitsu 20. Jun 2009 10:06

Re: String nach Muster durchsuchen
 
Zitat:

Zitat von Linguini
In dem Thread habe ich leider nur Möglichkeiten gefunden, ob dieser String existiert, ich suche aber etwas das mir die Position bzw. gleich den ganzen String zurückgibt.

Zitat:

CompareWildStringEx liefert nicht TRUE bei erfolgreichem Vergleich, sondern die in den WildCards enthaltenen Zeichen/Strings.
merkt man vieleicht auch am Funktionsergebnis, welches rein zufällig Strings liefert :mrgreen:

Delphi-Quellcode:
Unit Types;

Var S, Se: String;
  X: TStringDynArray;

S := 'FesterTeil|VeränderlicherTeil|FesterTeil';
X := CompareWildStringEx('FesterTeil|*|FesterTeil', S, []);
If X <> nil Then Se := X[0] Else Se := ''; // 0 = erstes/einziges *
ShowMessage('Se = "' + Se + '"');
ein Unterschied zu RegEx, welches standardmäßig mitten im String such ... meine Funktion verleicht immer den ganzen String:
Delphi-Quellcode:
S := 'irgendwas|FesterTeil|VeränderlicherTeil|FesterTeil|irgendwas';
X := CompareWildStringEx('*FesterTeil*FesterTeil*', S, []);
If X <> nil Then Se := X[1] Else Se := ''; // 1 = zweites *
ShowMessage('Se = "' + Se + '"');
ja und da nur je ein Ergebnis gesucht wird und man kein Offset angeben kann (wobei ein Offset nachzurüsten kein Problem wär, nur woher das Offset nehmen),
aber indem man das Suchmuster verlängert....
Delphi-Quellcode:
Var S, Ss, Se, Se2: String;
  i: Integer;
  X: TStringDynArray;

Begin

  S := 'irgendwas|FesterTeil1|VeränderlicherTeil1|FesterTeil2|irgendwas'
    + 'irgendwas|FesterTeil1|VeränderlicherTeil2|FesterTeil2|irgendwas';

  X := CompareWildStringEx('*FesterTeil1*FesterTeil2*FesterTeil1*FesterTeil2*', S, []);
  If X <> nil Then Begin
    Se := X[1]; // 1 = zweites *
    Se2 := X[3]; // 3 = viertes *
  End Else Begin
    Se := '';
    Se := '';
  End;

  ShowMessage('Se[0] = "' + Se + '"    Se[1] = "' + Se2 + '"');



  S := 'irgendwas|FesterTeil1|VeränderlicherTeil1|FesterTeil2|irgendwas'
    + 'irgendwas|FesterTeil1|VeränderlicherTeil2|FesterTeil2|irgendwas'
    + 'irgendwas|FesterTeil1|VeränderlicherTeil3|FesterTeil2|irgendwas';

  i := -1;
  Ss := '*FesterTeil1*FesterTeil2*';
  While True do Begin
    X := CompareWildStringEx(Ss, S, []);
    If X = nil Then Break;
    Inc(i);
    Ss := '*FesterTeil1' + Ss; // Ss := '*FesterTeil1*FesterTeil2*' + Ss;
    Se := X[Length(X) - 2];

    ShowMessage('Se[' + IntToStr(i) + '] = "' + Se + '"');
  End;
man könnte das zwar noch optimieren, aber das laß ich jetzt erstmal

Linguini 24. Jun 2009 13:32

Re: String nach Muster durchsuchen
 
So hab mich mal in RegEx eingelesen und zumindest schon mal E-Mail Adresse raussuchen hinbekommen =)
Jetzt will ich Hyperlinks raussuchen also alles zwischen href=" und dem Ende.


Delphi-Quellcode:
begin
writeln(myFile,'Hyperlinks:');
RegExpr := nil;
  try
    RegExpr := TRegExpr.Create;
    if RegExpr <> nil then begin
      RegExpr.Expression := '|[url="(.*?)"](.*?)[/url]|' ;

      if RegExpr.Exec(memo1.text) then
        repeat
          Writeln(myFile,(RegExpr.Match[1]));
        until not RegExpr.ExecNext;

    end;
  except
  end;
  RegExpr.Free;
So wird das leider nichts...
Entdeckt jemand den Fehler bei der Expression?


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz