Отправляет email-рассылки с помощью сервиса Sendsay

Delphi для профессионалов

  Все выпуски  

Delphi для профессионалов - Фильтрованный поиск в строке по маске


Информационный Канал Subscribe.Ru


eServer.ru :: Хостинг без ограничений!

Рассылка: Delphi для профессионалов

Количество подписчиков: 3043
Рассылка 'Delphi для профессионалов'

Выберите действие:
Заглавие (одной строкой) :
Содержание :

От кого :
Не показывать мой e-mail другим пользователям


Фильтрованный поиск в строке по маске

Есть множество задач, где необходимо использование так называемой "дикой карты", то есть поиск в строке по фильтру, когда в качестве поиска используется подстрока с символом "*" (звездочка). Например, если необходимо выяснить наличие подстроки 'St' с какими-либо символами перед ней, то в качестве параметра для поиска задается подстрока вида '*St'. Звездочка может присутствовать как в начале/конце подстроки, так и по обеим ее сторонам. Также при составлении фильтра вместо любого одиночного символа возможна подстановка знака вопроса.

Пока функция может только сообщать о наличии необходимых вложений, но было бы интересно получить ваши примеры, которые могли бы и возвращать искомую подстроку.

{Данная функция осуществляет сравнение двух строк. Первая строка
 может быть любой, но она не должна содержать символов соответствия (* и ?).
 Строка поиска (искомый образ) может содержать абсолютно любые символы.

 Для примера: MatchStrings('David Stidolph','*St*') возвратит True.

 Автор оригинального C-кода Sean Stanley
 Автор портации на Delphi David Stidolph
}

function MatchStrings(source, pattern: String):Boolean;
var
  pSource  : Array [0..255] of Char;
  pPattern : Array [0..255] of Char;
  function MatchPattern(element, pattern:PChar): Boolean;
    function IsPatternWild(pattern: PChar):Boolean;
    var
      t: Integer;
    begin
      Result:=StrScan(pattern,'*')<>nil;
      if not Result then Result:=StrScan(pattern,'?')<>nil;
    end;
  begin
    if StrComp(pattern,'*')=0 then Result := True
      else if (element^ = Chr(0)) and (pattern^ <> Chr(0)) then Result:=False
        else if element^ = Chr(0) then Result := True
          else begin
            case pattern^ of
              '*': if MatchPattern(element,@pattern[1]) then Result:=True
            else
              Result:=MatchPattern(@element[1],pattern);
              '?': Result:=MatchPattern(@element[1],@pattern[1]);
          else if element^=pattern^ then
            Result:=MatchPattern(@element[1],@pattern[1])
        else
          Result:=False;
      end;
    end;
  end;

begin
  StrPCopy(pSource,source);
  StrPCopy(pPattern,pattern);
  Result:=MatchPattern(pSource,pPattern);
end; 

Все вопросы присылайте по адресу: delphi-ask@igp.org.ua
Все ответы присылайте по адресу: delphi-reply@igp.org.ua
Все подсказки присылайте по адресу: delphi-hint@igp.org.ua

Со всем списком советов можно познакомиться по адресу: http://igp.org.ua/delphine/.
Наш проект Delphine можно найти по следующей ссылке: http://igp.org.ua/products/delphine/.

Заходите в наш форум: Форум Delphi-профессионалов. Адрес: http://igp.org.ua/cgi-bin/yabb/yabb.pl.
Здесь Вы найдете ответы на все Ваши вопросы!

Выберите действие:
Заглавие (одной строкой) :
Содержание :

От кого :
Не показывать мой e-mail другим пользователям



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное