Mega Code Archive

 
Categories / Delphi / OOP
 

[] 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.