سؤال

في دلفي 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" في السلسلة.

يجب أن يكون هناك شيء ما في مكان ما، لأن حوار البحث القياسي لديه "تطابق الكلمة كاملة فقط" كواحد من خياراتها.

كيف يتم تنفيذ هذا عادة (أو أفضل)؟


خاتمة:

إجابة RRUZ كانت مثالية. كان روتين SearchBuf فقط ما أحتاجه. يمكنني حتى أن أذهب إلى روتين Strutils، واستخراج الرمز، وتعديله لتناسب متطلباتي.

لقد فوجئت بالعثور على أن SearchBuf لا يبحث أولا عن الكلمة ثم تحقق من المحددات. بدلا من ذلك، يمر عبر شخصيات السلسلة الأولى في وقت يبحث عن محدد. إذا وجد ذلك، فهو يتحقق من السلسلة وحدد محدد. إذا لم تجد ذلك، فإنه يبحث عن محدد آخر. من أجل الكفاءة، هذا ذكي جدا!

هل كانت مفيدة؟

المحلول

يمكنك استعمال ال Searchbuf. وظيفة مع خيار [sowholeword].

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]);

وداعا.

نصائح أخرى

فقط لأن محرر Delphi لديه وظيفة "مباراة كلمة"، وهذا لا يعني أن مكتبة دلفي توفر ذلك!

عادة، في معظم اللغات الطريقة للذهاب لهذا التعبير العادي. يبدو أنهم (لا يزالون) لم يتم بناؤهم في دلفي، حيث توجد مكتبات الطرف الثالث التي تقدم القدرة. المثال الأول الذي وجدته هو: http://delphi.about.com/od/toppicks/tp/delphi- express-expressions.htm. .

عادة، كنت تقوم ببناء تعبير منتظم شيء مثل

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

سترغب في الحصول على تفاصيل من توثيق المكتبة التي تحصل عليها. مثالي لا يتعامل بشكل صحيح في التعامل مع حالة الكلمة التي تبدأ في بداية المجموعة أو تنتهي في نهايتها، أو أن تكون كل نوع.

هذه الوظيفة ليست بالضبط ما تحتاجه ولكنه قريب جدا:

أرجو أن يكون ذلك مفيد:

{ 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;

إذا كان لديك وظيفة مثل أدناه

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]);

قد لا تسقط أي مشكلة إذا اتصلت به مرة واحدة. ولكن إذا قمت بالاتصال بهذا في حلقة (على سبيل المثال 1000 مرة أو أكثر)، فسوف تعطيك وظيفة نقاط البيع الأولى (مثل أدناه) أداء إضافي بشكل مدهش

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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top