Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Wort alleine im String finden (https://www.delphipraxis.net/165977-wort-alleine-im-string-finden.html)

Helmi 24. Jan 2012 17:08

Wort alleine im String finden
 
Hallo,

ich stehe gerade auf dem Schlauch.

Beispiel:
ich habe folgenden String:
Delphi-Quellcode:
'Ein Text mit and und auch mit b_and und so'
und ich möchte nun in diesem String das "and" finden und markieren.

Momentan mach ich es so, dass ich nach der Position von "and" suche, mir das Zeichen zuvor und danach anschaue, diese mit "erlaubten"
Zeichen vergleiche und dann das Wort markiere.

Gibt es eine Funktion, die das eleganter macht, also das Wort sucht und zwar alleine stehend?

CCRDude 24. Jan 2012 17:11

AW: Wort alleine im String finden
 
Eventuell mit einem regulären Ausdruck, dann kannst Du die davor und danach erlaubten Zeichen gleich mit in den einen Suchaufruf verpacken? Findest Du in der RTL-Unit RegularExpressions.pas.

himitsu 24. Jan 2012 17:13

AW: Wort alleine im String finden
 
RegEx ?
Damit kann man auch Ausschließungen und/oder Wortgrezen in die Suchmaske mit aufnehmen.

[edit]
CCRDude war schonwieder schneller als die faule RedBox

Helmi 24. Jan 2012 17:18

AW: Wort alleine im String finden
 
Dummerweise kommen mir meist die Einfälle wenn ich auf den Button "Thema erstellen" drücke :-)

Ich beweg mich im RichEdit und da kann ich RichEdit.FindText verwenden und da kann man nach ganzen Wörtern suchen lassen

himitsu 24. Jan 2012 18:21

AW: Wort alleine im String finden
 
Wenn ich mich nicht verdacht hab und für ohne RichEdit...
Delphi-Quellcode:
uses
  StrUtils, Character;

type
  TPosExMode = set of (pemCaseInsensitive, pemWholeWord);

function PosEx2(SubStr, S: string;    Offset: Integer = 1; SerarchMode: TPosExMode = []): Integer; overload;
function PosEx2(SubStr, S: AnsiString; Offset: Integer = 1; SerarchMode: TPosExMode = []): Integer; overload;



function PosEx2(SubStr, S: string; Offset: Integer; SerarchMode: TPosExMode): Integer;
begin
  if pemCaseInsensitive in SerarchMode then begin
    SubStr := AnsiUpperCase(SubStr);
    S     := AnsiUpperCase(S);
  end;
  Result := Offset - 1;
  repeat
    Result := PosEx(SubStr, S, Result + 1);
  until (Result = 0) or not (pemWholeWord in SerarchMode) or (((Result = 0) or not IsLetterOrDigit(S[Result - 1]))
    and ((Result + Length(SubStr) > Length(S)) or not IsLetterOrDigit(S[Result + Length(SubStr)])));
end;

function PosEx2(SubStr, S: AnsiString; Offset: Integer; SerarchMode: TPosExMode): Integer;
const
  WordChars: TSysCharSet = ['a'..'z', 'A'..'Z', '0'..'9'];
begin
  if pemCaseInsensitive in SerarchMode then begin
    SubStr := AnsiUpperCase(SubStr);
    S     := AnsiUpperCase(S);
  end;
  Result := Offset - 1;
  repeat
    Result := PosEx(SubStr, S, Result + 1);
  until (Result = 0) or not (pemWholeWord in SerarchMode) or (((Result = 0) or not (S[Result - 1] in WordChars))
    and ((Result + Length(SubStr) > Length(S)) or not (S[Result + Length(SubStr)] in WordChars)));
end;

// Beitrag zitieren und dort den Code rauskopieren ... hier ist die Codeformatierung häßlich.

Beim RichEdit pass aber auf, daß FindText den Index für SelStart, SelLength und RichEdit.Text liefert.
Zu RichEdit.Lines.Text paßt dieser Index nicht mehr, daß RichEdit neuerdings einen anderen Zeilenumbruch verwendet. (die Mac #13)

Furtbichler 25. Jan 2012 06:04

AW: Wort alleine im String finden
 
In den StrUtils gibt es eine Funktion dafür: ExtractWords oder so.

himitsu 25. Jan 2012 08:30

AW: Wort alleine im String finden
 
Ohh, da steht wirklich was mit "words"
Delphi-Referenz durchsuchenSearchBuf

p80286 25. Jan 2012 09:14

AW: Wort alleine im String finden
 
Also ich hab nur soWholeWord gesehen, aber was bitte wird als Worttrenner benutzt?
Neben Blank CarriageReturn Linefeed Tab ... ??

Gruß
K-H

himitsu 25. Jan 2012 09:41

AW: Wort alleine im String finden
 
Meistens werden Grenzen zwischen einem "Zeichen welcher ein Buchstabe oder eine Ziffer darstellt" und einem "Zeichen welches etwas Anderes darstellt" als Trennlinie verwendet.
Darum auch
Delphi-Quellcode:
not IsLetterOrDigit
> Delphi-Referenz durchsuchenIsLetterOrDigit.

Also Satzzeichen, Leerzeichen, Steuerzeichen, mathematische Zeichen, Symbole usw.


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