![]() |
Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
Hallo,
mittels folgendem Code ermittle ich die Anzahl eines Suchbegriffes innerhalb eines Textes.
Delphi-Quellcode:
Damit wird aber z. B. der Suchbegriff "und" auch in "Kunde" gefunden.
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; Wie kann ich eine Suche nach "ganzem Wort" realisieren? Wichtig ist hierbei, dass alle Vorkommen innerhalb des Textes gezählt werden sollen. |
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.
|
AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
Vielleicht ist ja
![]() |
AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
Zitat:
|
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.
|
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:
|
AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
Hallo,
versuch mal folgendes (auf Deine Problemstellung anzupassen):
Delphi-Quellcode:
Gruß
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; |
AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
Zitat:
Delphi-Quellcode:
raugefunden.
i := q - p;
Aber warum muss es
Delphi-Quellcode:
lauten und nicht
i := q - p;
Delphi-Quellcode:
?
i := p - q;
|
AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
Weil das Ergebnis dann negativ würde?
|
AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
Zitat:
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 ?? |
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.
|
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:
damit ist p > q und die "Distanz" also Anzahl der Zeichen dazwischen q - p.
---------------------------------------------
^ ^ p q Gruß |
AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
Zitat:
Zitat:
|
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; |
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; |
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; |
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:
Mfg
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; |
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 |
AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
Zitat:
Der Whitespace ist für die Ansi-Version
Delphi-Quellcode:
wie folgt definiert
SearchBuf
Delphi-Quellcode:
bzw. für die Unicode-Version wird
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')];
Delphi-Quellcode:
bemüht.
TCharHelper.IsLetterOrDigit
Also wirst du wohl deine eigene SearchBuf Routine schreiben müssen |
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 |
AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
Zitat:
|
AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
Zitat:
War einfacher |
AW: Suchbegriff als "ganzes Wort" innerhalb eines Textes suchen
Als Idee, wieso keine regulären Ausdrücke verwenden?
![]() 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