Thema: Delphi mehrzeiliges suchen

Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: mehrzeiliges suchen

  Alt 7. Jun 2005, 15:43
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...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat