Hallo,
ich habe mir vor einiger Zeit einen Stringvergleich mit Wildcards gebaut:
Delphi-Quellcode:
function MatchesMask(text, mask: string; Modus: byte; CaseSensitive: Boolean): boolean;
var
po,i: Integer;
{ Modus 0 = exakt - 1 = mit Joker - 2 = kommt vor
Joker =
* jeweils 1* entweder am Anfang oder Ende z.B. Hamb* oder *burg
? gleiche Länge von Text und Maske z.B. M??er
auch Kombinationen sind möglich z.B. ?amb* oder *b?rg}
begin
case Modus of
0,
1: begin
if Modus = 1 then begin
po:=Pos('*',mask);
if po = 1 then begin // * am Anfang
if Length(Mask) = 1 then begin //nur * = alles!
Result:=true;
Exit;
end;
System.Delete(text,1,Length(text)-Pred(Length(Mask)));
text:='*'+text
end
else
if po > 1 then begin // * am Ende
System.Delete(text,po,MAXINT);
text:=text+'*'
end;
if Length(mask) = Length(text) then
for i:=1 to Length(text) do
if mask[i] = '?' then text[i]:=mask[i];
end;
if CaseSensitive then
Result:=AnsiCompareStr(text,mask) = 0
else
Result:=AnsiCompareText(text,mask) = 0;
end;
2: begin
if not CaseSensitive then begin
text:=AnsiUpperCase(text);
mask:=AnsiUpperCase(mask)
end;
Result:=Pos(mask,text) > 0
end;
end
end; {MatchesMask}
Anders als der Tipp von Shmia kommt er ohne GOTO aus und bietet noch mehr Möglichkeiten.
MfG