AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

mehrzeiliges suchen

Ein Thema von maximus Caesar · begonnen am 7. Jun 2005 · letzter Beitrag vom 7. Jun 2005
Antwort Antwort
Benutzerbild von maximus Caesar
maximus Caesar

Registriert seit: 26. Sep 2004
Ort: Biberach
319 Beiträge
 
Turbo Delphi für Win32
 
#1

mehrzeiliges suchen

  Alt 7. Jun 2005, 15:22
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
  Mit Zitat antworten Zitat
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
Benutzerbild von maximus Caesar
maximus Caesar

Registriert seit: 26. Sep 2004
Ort: Biberach
319 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: mehrzeiliges suchen

  Alt 7. Jun 2005, 16:02
Jup, das reicht mir!
Danke!
  Mit Zitat antworten Zitat
Antwort Antwort


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 +1. Es ist jetzt 17:53 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