![]() |
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 |
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:
wobei die Funktion Matches so definiert ist:
For i:=0 To A.Count - B.Count do
If Matches (A,i,B) Then Showmessage (Format ('B wurde ab Zeile %d gefunden',[i]));
Delphi-Quellcode:
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').
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; 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... |
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