DelphiFAQ Home Search:
General :: Programming :: Delphi :: Strings
Algorithms for string handling problems, implemented in Delphi but useful for any procedural language.

Articles:

This list is sorted by recent document popularity (not total page views).
New documents will first appear at the bottom.

Featured Article

Compare two strings with wildcards (*, ?)

If you need to compare two strings where one contains wildcards (just * and ?), you may find the following useful - I used it years ago in a Turbo Pascal project.

It was a DOS program.. that's why it contains those type definitions at the top.
In Delphi 2/3 you may replace them just with string - otherwise you'll need to set the compiler syntax option "Strict Var-Strings" OFF = {$V-}.

The part at the bottom shows how to use the routine WildComp.

type
   PathStr = string[128]; { in Delphi 2/3: = string }
   NameStr = string[12];  { in Delphi 2/3: = string }
   ExtStr  = string[3];   { in Delphi 2/3: = string }
 
 {$V-} { in Delphi 2/ 3 to switch off "strict var-strings" }
 
 function WildComp(FileWild,FileIs: PathStr): boolean;
 var
   NameW,NameI: NameStr;
   ExtW,ExtI: ExtStr;
   c: byte;
 
   function WComp(var WildS,IstS: NameStr): boolean;
   var
     i, j, l, p : Byte;
   begin
     i := 1;
     j := 1;
     while (i<=length(WildS)) do
     begin
       if WildS[i]='*' then
       begin
         if i = length(WildS) then
         begin
           WComp := true;
           exit
         end
         else
         begin
           { we need to synchronize }
           l := i+1;
           while (l < length(WildS)) and (WildS[l+1] <> '*') do
             inc (l);
           p := pos (copy (WildS, i+1, l-i), IstS);
           if p > 0 then
           begin
             j := p-1;
           end
           else
           begin
             WComp := false;
             exit;
           end;
         end;
       end
       else
       if (WildS[i]<>'?') and ((length(IstS) < i)
 	  	  or (WildS[i]<>IstS[j])) then
       begin
         WComp := false;
  	exit
       end;
 
       inc (i);
       inc (j);
     end;
     WComp := (j > length(IstS));
   end;
 
 begin
   c:=pos('.',FileWild);
   if c=0 then
   begin { automatically append .* }
     NameW := FileWild;
     ExtW  := '*';
   end
   else
   begin
     NameW := copy(FileWild,1,c-1);
     ExtW  := copy(FileWild,c+1,255);
   end;
 
   c:=pos('.',FileIs);
   if c=0 then
     c:=length(FileIs)+1;
   NameI := copy(FileIs,1,c-1);
   ExtI  := copy(FileIs,c+1,255);
   WildComp := WComp(NameW,NameI) and WComp(ExtW,ExtI);
 end;
 
 begin
   if     WildComp('a*.bmp',  'auto.bmp') then ShowMessage('OK 1');
   if not WildComp('a*x.bmp', 'auto.bmp') then ShowMessage('OK 2');
   if     WildComp('a*o.bmp', 'auto.bmp') then ShowMessage('OK 3');
   if not WildComp('a*tu.bmp','auto.bmp') then ShowMessage('OK 4');
 end.
 

Generated 0:01:39 on Jun 19, 2018