Delphi-PRAXiS

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)

Helmi 26. Jan 2013 20:40


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

mittels folgendem Code ermittle ich die Anzahl eines Suchbegriffes innerhalb eines Textes.

Delphi-Quellcode:
  Offset := 1;

  max_Ende := length(Zeile);

  repeat
    akt_Pos := PosEx(SuchText, Zeile, Offset);

    If akt_Pos > 0 then
      begin
        If akt_Pos <= max_Ende then
          inc(Result);

        Offset := akt_Pos + 1;
      end;
  until akt_Pos = 0;
end;
Damit wird aber z. B. der Suchbegriff "und" auch in "Kunde" gefunden.
Wie kann ich eine Suche nach "ganzem Wort" realisieren?
Wichtig ist hierbei, dass alle Vorkommen innerhalb des Textes gezählt werden sollen.

DeddyH 26. Jan 2013 21:00

AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
 
Du musst eben jeden Treffer noch weiter analysieren. Davor und dahinter sind dann je nach Definition eines ganzen Wortes eben nur Leer- und Satzzeichen oder Zeilenumbrüche erlaubt. Außerdem musst Du noch schauen, ob es sich evtl. um den Textanfang oder das Textende handelt.

bernerbaer 26. Jan 2013 21:01

AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
 
Vielleicht ist ja StrUtils.SearchBuf das was Du suchst (Options: soWholeWord)

Helmi 26. Jan 2013 21:10

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

Zitat von bernerbaer (Beitrag 1200747)
Vielleicht ist ja StrUtils.SearchBuf das was Du suchst (Options: soWholeWord)

SearchBuf kannte ich schon - aber das liefert nur das erste Vorkommen - ich müsste es dann immer wieder aufrufen um alle Vorkommen zu finden, aber dann vermute ich, dass es sehr langsam wird

bernerbaer 26. Jan 2013 21:20

AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
 
Dann würden sich wohl noch die Verwendung von regulären Ausdrücken anbieten, ob das aber schneller ist als mit "searchbuf" wäre noch zu überprüfen.

Helmi 26. Jan 2013 21:46

AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
 
Ich hab SearchBuf ausprobiert und es schaut ganz gut aus
nur wie kann ich jetzt feststellen welche Position der gefundene Zeiger im Text hat?

Zitat:

Zitat von Hilfe
Wenn die Suche erfolgreich war, gibt SearchBuf einen Zeiger auf das erste Zeichen der Fundstelle in Buf zurück. Andernfalls wird nil (Delphi) bzw. NULL (C++) zurückgegeben.


Volker Z. 26. Jan 2013 22:04

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

versuch mal folgendes (auf Deine Problemstellung anzupassen):
Delphi-Quellcode:
procedure TForm4.Button2Click(Sender: TObject);
var
  c, i, l : Integer;
  p, q   : PAnsiChar;
  s      : Integer;
begin
  c := 0;
  i := 1;
  s := 'und';
  l := Length (Memo1.Lines.Text);
  p := PAnsiChar (Memo1.Lines.Text);
  q := SearchBuf (p, l, i, i, s, [soDown, soWholeWord]);

  while q <> nil do
    begin
      Inc (c);
      i := q - p;
      q := SearchBuf (p, l, i, i, s, [soDown, soWholeWord]);
    end
end;
Gruß

Helmi 26. Jan 2013 22:09

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

Zitat von Volker Z. (Beitrag 1200761)
Hallo,

versuch mal folgendes (auf Deine Problemstellung anzupassen):
Delphi-Quellcode:
procedure TForm4.Button2Click(Sender: TObject);
var
  c, i, l : Integer;
  p, q   : PAnsiChar;
  s      : Integer;
begin
  c := 0;
  i := 1;
  s := 'und';
  l := Length (Memo1.Lines.Text);
  p := PAnsiChar (Memo1.Lines.Text);
  q := SearchBuf (p, l, i, i, s, [soDown, soWholeWord]);

  while q <> nil do
    begin
      Inc (c);
      i := q - p;
      q := SearchBuf (p, l, i, i, s, [soDown, soWholeWord]);
    end
end;
Gruß

Danke für den Code - hab jetzt in der Zwischenzeit auch die Zeile
Delphi-Quellcode:
i := q - p;
raugefunden.

Aber warum muss es
Delphi-Quellcode:
i := q - p;
lauten und nicht
Delphi-Quellcode:
i := p - q;
?

DeddyH 26. Jan 2013 22:12

AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
 
Weil das Ergebnis dann negativ würde?

Helmi 26. Jan 2013 22:14

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

Zitat von DeddyH (Beitrag 1200764)
Weil das Ergebnis dann negativ würde?

Ja, aber warum?
Sorry - ich bin mit Zeigern nicht so bewandert

Meine Erklärung wäre, weil die Anfangsadresse des Textes kleiner ist, als die Adresse des 1. Suchbegriffes
??

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

Helmi 22. Jun 2013 11:49

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

Zitat von hberdel (Beitrag 1219436)
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

wohl im falschen Thread gelandet?

Helmi 22. Jun 2013 12:34

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

Zitat von Sir Rufo (Beitrag 1219429)
Also wirst du wohl deine eigene SearchBuf Routine schreiben müssen

Ja - das hab ich jetzt auch gemacht!
War einfacher

Jonas Shinaniganz 22. Jun 2013 14:23

AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
 
Als Idee, wieso keine regulären Ausdrücke verwenden?

http://delphi.about.com/gi/o.htm?zi=...fo/delphi.html

The TMatch record provides several properties with details about the match.
Value returns the matched string. Index and Length indicate the position in the input string and the length of the match.

The Matches method takes a string and returns a TMatchCollection record. The default Item[] property of this record holds a TMatch for each match the regular expression found in the string. If there are no matches, the Count property of the returned TMatchCollection record is zero.

Das hier gibt dir alle "hallo" auf die ein Leerzeichen vorrangeht und folgt.
Delphi-Quellcode:
Matches(' hallo ');
-
Das hier gibt dir alle "hallo" auf die ein Leerzeichen ein Punkt ein Fragezeichen oder ein Ausrufezeichen folgt oder garnichts von allem (also EOL)
Delphi-Quellcode:
Matches(' hallo[ ,/./?/!]?');


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