19. november 2002 - 17:29
Der er
6 kommentarer og
1 løsning
Jokersøgning
I forbindelse med en søgefunktion har jeg brug for en mulighed for at bruge jokere (*) i mit program.
Hvis jeg f.eks søger efter 'Ek*er*', så skal den vise 'Eksperten', søger jeg derimod efter 'X*er*' skal den ikke vise noget.
Det skal bare være noget ala det:
function IdenticalStr(JokerStr, Str: String): Boolean;
Så
IdenticalStr('Ek*er*', 'Eksperten') = true;
IdenticalStr('X*er*', 'Eksperten') = false;
20. november 2002 - 11:53
#2
Du kan bruge denne:
unit Wildcard;
interface
uses
SysUtils;
function WildcardMatch(const source, pattern: String): Boolean;
function WildcardMatchIC(const source, pattern: String): Boolean;
function WildcardMatchEx(const source, pattern: String; const ic: Boolean): Boolean;
implementation
function WildcardMatchEx(const source, pattern: String; const ic: Boolean): Boolean;
begin
{ perform a wildcard match, either case-sensitive or case-insensitive,
depending on the ic flag. }
if ic = True then
result := WildcardMatchIC(source, pattern)
else
result := WildcardMatch(source, pattern);
end;
function WildcardMatchIC(const source, pattern: String): Boolean;
begin
{ perform a case insensitive wildcard match by converting the pattern
and source strings to uppercase. }
result := WildcardMatch(UpperCase(source), UpperCase(pattern));
end;
function WildcardMatch(const 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;
begin
Result := StrScan(pattern,'*') <> nil;
if not Result then Result := StrScan(pattern,'?') <> nil;
end;
begin
if 0 = StrComp(pattern,'*') 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;
end.