7

Delphi 2009以降(Unicode)には、単語を定義する区切り文字を提供する、適度に効率的な単語全体の検索を実行する組み込み関数または小さなルーチンがどこかに記述されていますか。

function ContainsWord(Word, Str: string): boolean;

const  { Delim holds the delimiters that are on either side of the word }
  Delim = ' .;,:(){}"/\<>!?[]'#$91#$92#$93#$94'-+*='#$A0#$84;

どこ:

Word: string;  { is the Unicode string to search for }
Str: string;   { is the Unicode string to be searched }

「Word」が文字列に含まれている場合にのみ、trueまたはfalseの値を返すためにこれが必要です。

標準の検索ダイアログにはオプションの1つとして「単語全体を一致させる」があるため、これにはどこかに何かがあるはずです。

これは通常(または最良の)実装方法ですか?


結論:

RRUZの答えは完璧でした。SearchBufルーチンはまさに私が必要としていたものでした。StrUtilsルーチンに移動してコードを抽出し、要件に合うように変更することもできます。

SearchBufが最初に単語を検索してから、区切り文字をチェックしないことに驚いた。代わりに、文字列の文字を1つずつ調べて、区切り文字を探します。1つが見つかった場合は、文字列と別の区切り文字をチェックします。見つからない場合は、別の区切り文字を探します。効率のために、それは非常に賢いです!

4

4 に答える 4

19

[soWholeWord] オプションでSearchBuf関数を使用できます。

function SearchBuf(Buf: PAnsiChar; BufLen: Integer; SelStart: Integer; SelLength: Integer; SearchString: AnsiString; Options: TStringSearchOptions): PAnsiChar;

この例を参照してください

function ExistWordInString(aString:PWideChar;aSearchString:string;aSearchOptions: TStringSearchOptions): Boolean;
var
  Size : Integer;
Begin
      Size:=StrLen(aString);
      Result := SearchBuf(aString, Size, 0, 0, aSearchString, aSearchOptions)<>nil;
End;

このように使用してください

ExistWordInString('Go Delphi Go','Delphi',[soWholeWord,soDown]);

さよなら。

于 2009-11-05T07:05:44.797 に答える
2

Delphi のエディタに「単語一致」機能があるからといって、Delphi ライブラリがそれを提供しているわけではありません。

通常、ほとんどの言語では、これを行う方法は正規表現です。機能を提供するサードパーティのライブラリがあるため、Delphi には (まだ) 組み込まれていないようです。最初に見つけた例はhttp://delphi.about.com/od/toppicks/tp/delphi-regular-expressions.htmです。

通常、次のような正規表現を作成します。

myRegex = '[' + Delim + ']+' + Word + '[' + Delim + ']+';
if regexSearch (Str, myRegex) then ...

取得したライブラリのドキュメントから詳細を取得する必要があります。私の例では、単語が Str の先頭で始まるか末尾で終わるか、またはすべてが Str であるという大文字と小文字の区別を正しく処理していません。

于 2009-11-05T06:18:13.207 に答える