Einzelnen Beitrag anzeigen

Willie1

Registriert seit: 28. Mai 2008
657 Beiträge
 
Delphi 10.1 Berlin Starter
 
#12

Re: Stringvergleich mit Wildcards

  Alt 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.
  Mit Zitat antworten Zitat