// Wildcard Bedeutung
// ? ein Zeichen
// * kein oder beliebig viele Zeichen
// Zum besseren Verständnis ein paar Vergleichsbeispiele:
{
Pattern Txt Result
Te?? Test True
*Te*st** Test True
t*t Test True
???? Test True
????? Test False
Test? Test False
* Test True
}
function Cmp(const pattern, txt: string): Boolean;
type
arr = array of PChar;
var
zur: array of arr;
cn, cw: char;
x: integer;
pp: PChar;
pt: PChar;
procedure forall;
begin
dec(x);
while (x > -1) and (zur[x, 1]^ = #0) do dec(x);
if x < 0 then begin
result := False;
exit;
end;
pp := zur[x, 0];
Inc(pp);
Inc(zur[x, 1]);
pt := zur[x, 1];
Inc(x);
end;
begin
x := 0;
pp := @pattern[1];
pt := @txt[1];
while (pp^ > #0) or (pt^ > #0) do begin
case pp^ of
'*':
begin
setlength(zur, succ(x), 2);
zur[x, 0] := pp;
zur[x, 1] := pt;
Inc(x);
Inc(pp);
continue;
end;
'?':
begin
if pt^ = #0 then
begin
if x > 0 then begin
forall;
continue;
end;
result := False;
exit;
end;
end;
else
begin
cn := pt^;
cw := pp^;
if cn <> cw then
begin
if x > 0
then begin
forall;
continue;
end;
result := False;
exit;
end;
end;
end;
if pt^ > #0 then Inc(pt);
if pp^ > #0 then Inc(pp);
end;
result := true;
end;
function cmpwc(const pattern, txt: string): Boolean;
begin
result := Cmp(ansilowercase(
stringreplace(pattern, #32, '*', [rfreplaceall])), ansilowercase(
stringreplace(txt, #32, '*', [rfreplaceall])));
end;
// Beispielaufruf
procedure TForm1.Button7Click(Sender: TObject);
begin
if CmpWC('*RAU?EN?*', 'Schraubenfabrik')
then showmessage('passt') else showmessage('passt nicht');
end;