Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi mehrzeiliges suchen (https://www.delphipraxis.net/47186-mehrzeiliges-suchen.html)

maximus Caesar 7. Jun 2005 15:22


mehrzeiliges suchen
 
Hallo!
Also, ich habe zwei Textfelder, sagen wir mal Memos, A und B. In A befindet sihc der Text, der durchsucht werden soll. In B befindet sich ein mehrzeiliger Text, der in A gesucht werden soll. jetzt kann es aber sein, dass in B die Zeilen jeweils nur der Anfang der zu suchenden Zeile drinn ist. Also z.B. so:

Zu suchender Text in A:

test test2 test3 test4
testa testb testc

Text in B:

test test2
testa testb

wie kann ich jetzt die Zeilenzahl der obersten Zeile bekommen?
Also hier von
test test2 test3 test4

PS: In A kann es natürlich auch vorkommen, dass eine ähnliche konnstellation vor der richtigen auftaucht, z.B.
test test2 test3 test4
testa testc testb

alzaimar 7. Jun 2005 15:43

Re: mehrzeiliges suchen
 
Schöne kleine Aufgabe:
Erstmal kannst du ja mit POS(SubString, String) herausbekommen, ob SubString in String vorkommt und wo.
Dann folgendes:
Du gehst in A alle Zeilen durch und prüftst für jede Zeile, ob die korrespondierende Zeile aus B darin vorkommt.
"Korrespondierende" ist das Zauberwort. Hier ist ein Billig-Langsam-und-Teuer-Ansatz:

Delphi-Quellcode:
For i:=0 To A.Count - B.Count do
  If Matches (A,i,B) Then Showmessage (Format ('B wurde ab Zeile %d gefunden',[i]));
wobei die Funktion Matches so definiert ist:
Delphi-Quellcode:
Function Matches (aSrc : TstringList; aStartIndex : Integer; aPattern : TStringList) : Boolean;
Var
  i : Integer;

Begin
  Result := False; // Erstmal gehen wir davon aus das es nicht passt
  For i:=0 To aPattern.Count - 1 do // für jede Zeile in B (unser Pattern)
    If aStartIndex + i < aSrc.Count Then // passt das überhaupt noch in A ?
      If Pos (aPattern[i], aSrc[aStartIndex + i])<>1 Then // fängt die Zeile mit B[i] an?
        Exit                  // nein, also raus
      Else
    Else
      Exit;          // Kann eigentlich nicht passieren, aber sicher ist sicher
  Result := True;    // Wenn wir hier sind, haben wir eine Übereinstimmung
End;
Was ich hier gemacht habe, nennt sich 'stepwise refinement', also schrittweise Verfeinerung. Der erste Ansatz ist klar: Ich zähle alle Infrage kommenden Zeilen durch, ob B an dieser Stelle passt ('Matches').

Die Funktion Matches prüft dann nur noch, ob ab einer Position 'StartIndex' alle folgenden Zeilen mit B übereinstimmen.

Das Verfahren ist leider sehr langsam. Mit ein bischen Überlegung kann man das noch schneller machen. Aber wenn's so reicht...

maximus Caesar 7. Jun 2005 16:02

Re: mehrzeiliges suchen
 
Jup, das reicht mir!
Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:59 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