Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen (https://www.delphipraxis.net/172877-suchbegriff-als-ganzes-wort-innerhalb-eines-textes-suchen.html)

DeddyH 26. Jan 2013 22:15

AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
 
Richtig, da steht ja auch Inc(), womit der Zeiger auf das nächste Zeichen gesetzt wird.

Volker Z. 26. Jan 2013 22:16

AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
 
Hallo,

p zweigt auf das erste Zeichen in Deinem string, q auf die nächste Fundstelle

Code:
---------------------------------------------
^                         ^
p                         q
damit ist p > q und die "Distanz" also Anzahl der Zeichen dazwischen q - p.

Gruß

Helmi 26. Jan 2013 22:19

AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
 
Zitat:

Zitat von DeddyH (Beitrag 1200766)
Richtig, da steht ja auch Inc(), womit der Zeiger auf das nächste Zeichen gesetzt wird.

Zitat:

Zitat von Volker Z. (Beitrag 1200767)
Hallo,

p zweigt auf das erste Zeichen in Deinem string, q auf die nächste Fundstelle

Code:
---------------------------------------------
^                         ^
p                         q
damit ist p > q und die "Distanz" also Anzahl der Zeichen dazwischen q - p.

Gruß

Danke für die Erklärungen - ich sollte doch mal mehr mit Zeigern (in Delphi) arbeiten...

Bummi 26. Jan 2013 22:21

AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
 
Du kannst das ganze ja auch eine eine "neue" PosExfunktion einzwiebeln

Delphi-Quellcode:
Function PosWholeWord(const find,s:String;Start:Integer=0):Integer;
var
 p:PChar;
begin
   p := Searchbuf(PChar(s),length(s),Start,0,find,[soWholeWord,soDown]);
   if assigned(p) then
      Result := Integer( p - PChar(s)) + 1
   else
      Result := 0;
end;

Helmi 26. Jan 2013 22:37

AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
 
Habs jetzt so gelöst:

Delphi-Quellcode:
  Offset := 1;

  repeat
    P := SearchBuf(PWideChar(Zeile), max_Ende, 0, Offset, SuchText, StringSearchOptions);

    If Assigned(P) then
      begin
        akt_Pos := P - PWideChar(Zeile);

        inc(Result);

        Offset := akt_Pos + 1;
      end
    else
      begin
        akt_Pos := 0;
      end;
  until akt_Pos = 0;
end;

Helmi 21. Jun 2013 17:28

AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
 
jetzt muss ich das Thema aus der Versenkung holen...

Bei SearchBuf hab ich leider folgendes festgestellt:

Suche ich mit der Option "soWholeWord" so wird nur das ganze Wort gefunden
Leider aber auch wenn zuvor oder danach ein Unterstrich vorhanden ist.

Z. B.: Suchtext "hallo"

dann wird auch "_hallo_" gefunden - oder sogar bei "_hallo_du_da"

Wie kann ich dem SearchBuf beibringen, dass er den Unterstrich nicht als
Worttrenner nutzen soll?

Eine Möglichkeit wäre, nach SearchBuf prüfen, ob vor dem Suchtext und
nach dem Suchtext ein Unterstrich ist - aber gefallen tut mir das nicht

Hab da auf die Schnelle mal etwas zusammengeschustert, aber schön ist es
trotzdem nicht:

Delphi-Quellcode:
  //Variablen vordefinieren
  Offset := 0;

  repeat
    //Suchtext ab "Offset" suchen
    P := SearchBuf(PWideChar(Zeile), max_Ende, 0, Offset, SuchText, StringSearchOptions);

    //Offset nullen (falls P = nil ist)
    Offset := 0;

    //wenn der Suchtext gefunden wurde...
    If Assigned(P) then
      begin
        //Offset ermitteln (Pointer Suchwort - Pointer der Zeile) + 1
        Offset := (P - PWideChar(Zeile)) + 1;

        i := Offset - 1;
        If i >= 0 then
          If (Zeile[i] = '_') then
            Offset := 0;

        i := Offset + length(SuchText);
        If i <= length(Zeile) then
          If (Zeile[i] = '_') then
            Offset := 0;

        If Offset <> 0 then
          //Anzahl hochzählen
          inc(Result);
      end;
  until Offset = 0;

Ginko 21. Jun 2013 21:06

AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
 
Hi,
auf Searchbuf würde ich ganz verzichten, bei meinen Tests ist das mindesten 4 mal langsamer als die Standard PosEx Funktion (bzw. der Code unten).
Wie wäre es so:
Delphi-Quellcode:
function CountWordsStdWhole(const SearchFor, SearchIn: String): Integer;
var
  i: integer;
begin
  i := 1;
  Result := 0;
  repeat
    i := PosEx(SearchFor, SearchIn, i) + 1;
    if (i > 1) and (SearchIn[i-2] in [' ',#0,'.',',',#13,#10]) and (SearchIn[i+Length(SearchFor)-1] in [' ',#0,'.',',',#13,#10]) then
      Inc(Result)
    else
      exit;
  until False;
end;
Mfg

Helmi 21. Jun 2013 21:11

AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
 
Danke für den Code, aber ich nutz mehr als nur das "ganze Wort suchen" bei SearchBuf
und von daher möchte ich gern dabei bleiben

Sir Rufo 22. Jun 2013 09:23

AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
 
Zitat:

Zitat von Helmi (Beitrag 1219418)
Danke für den Code, aber ich nutz mehr als nur das "ganze Wort suchen" bei SearchBuf
und von daher möchte ich gern dabei bleiben

Das wird aber nicht machbar sein, denn jede Suchroutine die ganze Wörter erkennen soll, muss wissen, was zu einem Wort gehört und was nicht (Whitespace).

Der Whitespace ist für die Ansi-Version
Delphi-Quellcode:
SearchBuf
wie folgt definiert
Delphi-Quellcode:
const
  { Default word delimiters are any character except the core alphanumerics. }
  WordDelimiters: set of Byte = [0..255] -
    [Ord('a')..Ord('z'), Ord('A')..Ord('Z'), Ord('1')..Ord('9'), Ord('0')];
bzw. für die Unicode-Version wird
Delphi-Quellcode:
TCharHelper.IsLetterOrDigit
bemüht.

Also wirst du wohl deine eigene SearchBuf Routine schreiben müssen

hberdel 22. Jun 2013 11:46

AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
 
Hallo jaenicke und TReader,
vielen Dank für eure Antworten. Ich habe inzwischen die Ursache gefunden: Es lag an der Benutzerkontensteuerung. Der vom OS vorgegebene Wert verhinderte, dass der Alias, wo auch immer, gespeichert werden konnte. Für manche Dinge war er da, für die Entwicklungsumgebung nicht ...
Jetzt kann ich mir wieder Gedanken wegen der Datenbank machen.
Beste Grüße von French, in Kürze wieder in der Provence


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:54 Uhr.
Seite 2 von 3     12 3      

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