Советы по Delphi

       

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


Есть множество задач, где необходимо использование так называемой "дикой карты", то есть поиск в строке по фильтру, когда в качестве поиска используется подстрока с символом "*" (звездочка). Например, если необходимо выяснить наличие подстроки '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;vart: Integer;beginResult := StrScan(pattern,'*') <> nil;if not Result then Result := StrScan(pattern,'?') <> nil;end;
beginif 0 = StrComp(pattern,'*') thenResult := Trueelse if (element^ = Chr(0)) and (pattern^ <> Chr(0)) thenResult := Falseelse if element^ = Chr(0) thenResult := Trueelse begincase pattern^ of'*': if MatchPattern(element,@pattern[1]) thenResult := TrueelseResult := MatchPattern(@element[1],pattern);'?': Result := MatchPattern(@element[1],@pattern[1]);elseif element^ = pattern^ thenResult := MatchPattern(@element[1],@pattern[1])elseResult := False;end;end;end;
begin
StrPCopy(pSource,source);StrPCopy(pPattern,pattern);Result := MatchPattern(pSource,pPattern);end;
[000250]



Содержание раздела