Question

Dans Delphi 2009 ou version ultérieure (Unicode), sont-il des fonctions intégrées ou petites routines écrites quelque part qui va faire une recherche de mot entier raisonnablement efficace lorsque vous fournissez les délimiteurs qui définissent le mot, par exemple:.

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;

où:

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

Je ne besoin de ceci pour retourner une valeur true ou false si le « mot » est dans la chaîne.

Il doit y avoir quelque chose pour cela quelque part, parce que la norme de dialogue Rechercher a « Mot entier » comme l'un de ses options.

Comment est-ce normalement (ou mieux) mis en œuvre?


Conclusion:

La réponse de RRUZ était parfait. La routine SearchBuf était exactement ce qu'il me fallait. Je peux même aller dans la routine StrUtils, extraire le code, et de modifier pour l'adapter à mes besoins.

Je fus surpris de constater que SearchBuf ne recherche pas d'abord le mot, puis vérifier délimiteurs. Au contraire, il passe par les caractères de la chaîne une à la fois la recherche d'un delimiter. Si elle en trouve une, il vérifie la chaîne et un autre delimiter. Si elle ne trouve pas, il recherche alors une autre delimiter. Par souci d'efficacité, c'est très intelligent!

Était-ce utile?

La solution

Vous pouvez utiliser le SearchBuf avec le [ soWholeWord] option.

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

Voir cet exemple

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;

Utilisez cette façon

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

Au revoir.

Autres conseils

Tout simplement parce que l'éditeur de Delphi a une fonction « correspondance mot », cela ne signifie pas la bibliothèque Delphi offre le!

En règle générale, dans la plupart des langues, la voie à suivre pour cela est une expression régulière. On dirait qu'ils sont (encore) intégré à Delphi, comme il y a des bibliothèques 3ème partie qui offrent la possibilité. Le premier exemple que j'ai trouvé est: http: //delphi.about .com / od / toppicks / tp / delphi-régulier expressions.htm .

En règle générale, vous souhaitez construire une chose régulière d'expression comme

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

Vous voulez obtenir des détails de la documentation de la bibliothèque que vous obtenez. Mon exemple ne gère pas correctement le cas du mot commençant au début de Str ou se terminant à son extrémité, ou d'être tous Str.

Cette fonction est pas exactement ce que vous avez besoin, mais il est assez proche:

Je l'espère, il est utile:

{ Copy all whole words from MainStr. The result will not have more than MaxChars characters. }

function CopyWords(MainStr: string; MaxChars: Integer): string;   
VAR EndsInSpace: Boolean;
    EndString, i: Integer;
    NextChar: char;
begin
 Assert(MaxChars > 0);
 EndString:= MaxChars;

 if Length(MainStr) > MaxChars then
  begin
   NextChar:= mainstr[MaxChars+1];

   if (MainStr[MaxChars] <> ' ') AND (NextChar <> ' ')
   then
     begin
      for i:= MaxChars downto 1 DO
       if MainStr[i]= ' ' then
        begin
         EndString:= i;
         Break;
        end
     end
   else
    if (MainStr[MaxChars]  = ' ')
    OR (MainStr[MaxChars] <> ' ') AND (NextChar = ' ')
    then EndString:= MaxChars;
  end;

 Result:= CopyTo(MainStr, 1, EndString);
 Result:= TrimRight(Result);
end;

Si vous avez la fonction comme ci-dessous

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;

et l'appeler comme ceci:

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

Vous ne pouvez pas tombé de problème si vous l'appelez une fois. Mais si vous appelez cela dans une boucle (par exemple 1000 fois ou plus) en utilisant d'abord la fonction Pos (comme ci-dessous) vous donnera étonnamment davantage de performance

function ExistWordInString(const AString:string;const ASearchString:string;ASearchOptions: TStringSearchOptions): Boolean;
var
  Size : Integer;
  AWChar: PWideChar;
begin
   if Pos(LowerCase(ASearchString), LowerCase(AString)) = 0 then
   begin
      Exit(False);
   end;

   AWChar := PWideChar(AString);
   Size:=StrLen(AWChar);
   Result := SearchBuf(AWChar, Size, 0, 0, ASearchString, ASearchOptions)<>nil;
end;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top