Registriert seit: 28. Mai 2008
657 Beiträge
Delphi 10.1 Berlin Starter
|
Re: Stringvergleich mit Wildcards
17. Dez 2008, 19:11
Obwohl ich es selbst z.Z. nicht brauche, noch ein Codebeispiel, wo auch in mask die Joker selbst vorkommen können. Dem Joker # voranstellen. Also: #? #* und ##. #0 darf in text NICHT vorkommen!
Delphi-Quellcode:
function MatchesMask_(text, mask: string; Modus: byte; CaseSensitive: Boolean): boolean;
const
Joker = ['*','?','#'];
var
po,i: Integer;
tmp: string;
ch: Char;
{ Modus 0 = exakt - 1 = mit Joker - 2 = Suchwort kommt vor
Joker =
* jeweils 1* NICHT *ambu*
? gleiche Länge von Text und Maske z.B. M??er
auch Kombinationen sind möglich z.B. ?amb* oder *b?rg
Wenn in mask Joker-Zeichen selbst vorkommen sollen, # voranstellen z.B #? #* ##}
begin
case Modus of
0,
1: begin
if Modus = 1 then begin
po:=Pos('#',mask);
while po > 0 do begin
ch:=mask[Succ(po)];
if ch in Joker then begin
System.Delete(mask,Succ(po),1);
case ch of
'*': ch:=#1;
'?': ch:=#2;
'#': ch:=#3
end;
mask[po]:=ch;
po:=Pos('#',mask)
end
else begin
Result:=false; // einmal # in mask ergibt immer false!!!
Exit
end;
end;
po:=Pos('?',mask);
while po > 0 do begin
mask[po]:=#0;
po:=Pos('?',mask)
end;
i:=Pos('*',mask);
po:=Pos(#1,mask);
while po > 0 do begin
mask[po]:='*';
po:=Pos(#1,mask)
end;
po:=Pos(#2,mask);
while po > 0 do begin
mask[po]:='?';
po:=Pos(#2,mask)
end;
po:=Pos(#3,mask);
while po > 0 do begin
mask[po]:='#';
po:=Pos(#3,mask)
end;
if i > 0 then begin
tmp:=text;
System.Delete(text,i,MAXINT);
System.Delete(tmp,1,Length(tmp) - Length(mask) + i);
text:=text + '*' + tmp;
end;
if Length(mask) = Length(text) then
for i:=1 to Length(text) do
if mask[i] = #0 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_}
W.
|
|
Zitat
|