Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Suche (https://www.delphipraxis.net/89512-suche.html)

dominikkv 1. Apr 2007 14:06


Suche
 
Hi

wie suche ich am besten in einem String nach einem anderen Teilstring?
ich will nur wissen ob der Teilstring (oder auch variationen davon) in dem String enthalten ist.
Beispiel:

Ich suche nach: "Das Haus"
Dabei soll ein positiver Fund erfolgen wenn ich in dem String "Das Haus ist schön" oder "Das runde Haus" oder "bla dashausblabla" oder "Haus das" suche.

Hat jemand ne Ahnung wie ich das am besten machen?

mfg.dominik

Nikolas 1. Apr 2007 14:28

Re: Suche
 
Du schaust ob das Ergebniss von 'pos' größer als -1 ist. (Siehe OH)
Also etwa
if (pos(uppercase(das),uppercase('DAS Haus ist schoen'))>-1)then showmessage('hallo');

inherited 1. Apr 2007 14:41

Re: Suche
 
Du zerlegst den Suchstring mit ' ' als Delimmiter in die einzelnen Worte und suchst mit Pos jeweils ob es drin vorkommt.
So, ich muss los, Anzug für Delphi-Tage kaufen :mrgreen:

DBR 1. Apr 2007 15:42

Re: Suche
 
Delphi-Quellcode:
const
  Delimiters = [#1..#47, #58..#64, #91..#96, #123..#191, #215, #216, #247, #248];
  Delimiters_0 = [#0] + Delimiters;

procedure GetWords(s: string; woerter: TStrings);
var
  p, r: pchar;
  Token: string;
begin
  woerter.Clear;
  p := pchar(s);
  repeat
    r := p;
    while not (p^ in Delimiters_0) do inc(p);
    SetString(Token, r, p - r);
    if Token <> '' then woerter.Add(Token);
    while p^ in Delimiters do inc(p);
  until p^ = #0;
end;

function such(Txt, Pattern: string): boolean;
var
  slP: TStringlist;
  x: integer;
  pt: PChar;
  p: array of PChar;
  i: array of integer;
  b: array of boolean;
begin
  if (Txt = '') or (Pattern = '') then begin
    result := false;
    exit;
  end;
  Txt := ansiuppercase(Txt);
  Pattern := ansiuppercase(Pattern);
  slP := TStringlist.Create;
  GetWords(Pattern, slP);
  setlength(p, slP.count);
  setlength(i, slP.count);
  setlength(b, slP.count);
  for x := 0 to slP.count - 1 do begin
    p[x] := @slP[x][1];
    i[x] := length(slP[x]);
    b[x] := false;
  end;
  pt := @Txt[1];
  while pt^ <> #0 do begin
    for x := 0 to high(p) do
      if comparemem(pt, p[x], i[x]) then b[x] := true;
    inc(pt);
    result := true;
    for x := 0 to high(b) do
      result := result and b[x];
    if result then break;
  end;
  b := nil;
  i := nil;
  p := nil;
  slP.free;
end;

procedure TForm1.Button4Click(Sender: TObject);
var
  suchtext: string;
begin
  suchtext := 'Das Haus';
  if such('Ein schönes Haus, das ist klar.', suchtext)
    then showmessage('"' + suchtext + '" ist vorhanden') else
    showmessage('"' + suchtext + '" ist nicht vorhanden');
end;

omata 1. Apr 2007 15:49

Re: Suche
 
Zitat:

Zitat von Nikolas
if (pos(...) > -1) then ...

Ist das nicht immer wahr? :gruebel:

Verwirrte Grüsse
Thorsten

Die Muhkuh 1. Apr 2007 15:51

Re: Suche
 
Doch ist es. Es muss > 0 heißen ;)

MrKnogge 1. Apr 2007 15:52

Re: Suche
 
pos gibt nie -1 zurück, wenn der gesuchte String nicht vorkommt erhält man 0!

Gruß

r2c2 1. Apr 2007 16:07

Re: Suche
 
Siehe auch: http://r2c2.weingut-rehn.de/content3...mit_Delphi.htm

mfg

Christian

dominikkv 3. Apr 2007 13:19

Re: Suche
 
danke an alle... ihr habt mir sehr geholfen :mrgreen:
besonderen dank an DBR


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