function MatchPatern(Value, Patern: string): Boolean;
begin
  //要达到的目的是如果Value匹配由Patern指定的模式
  //就返回True,否则返回False
  //例如
  //Value='a.txt',Patern='*.txt',Result=True
  //Value='abc.txt',Patern='a?c.txt',Result=True
  //……
  //这个函数该怎么写?
end;

解决方案 »

  1.   

    有个想法:
    将patern中去掉通配符后的字符串与value比较,如果是value的子串,则结果为true,否则为false;
      

  2.   

    function MatchPatern(Value, pattern: string): Boolean;
    begin
      pattern:=insert(pattern,value[pos('*',pattern)]);
      pattern:=delete(pattern,'*',1);
      if pattern=value then result:=true
      else result:=false;
    end;
      
    直接把pattern中的*或者?号变成value中相应位置的字符,然后,两者进行比较
    如实参如下
    var:='abc'
    pattern:='a*c'我们就把pattern:='a*c'变成'abc'
    方法如下。
    pattern:=insert(pattern,value[pos('*',pattern)],pos('*',pattern));
    pattern:=delete(pattern,'*',1);
    if pattern=value then result:=true
      else result:=false;
      

  3.   

    leiqinggang:
    你的方法只对a.txt和*.txt之类的组合有效。但是如果是abc.txt与a*.txt,用你的方法就无效了。
      

  4.   

    var
      sr: TSearchRec;
    begin
      if findfirst('path\*.txt',faAnyFile,sr)=0 then
        showmessage(sr.Name);
      while FindNext(sr) = 0 do
        showmessage(sr.Name);     //通过sr可以取得文件名
      FindClose(sr);
    end;
      

  5.   

    ahuige:
    谢谢!你启发了我一些思路。
    但是,你的方法只是对单字符匹配有效。可我希望做到的是类似于DOS的文件名匹配一样,?代表单个字符,*代表一个或多个字符。对于*这种情况,应该怎么办呢?
      

  6.   

    去掉通配符,分别获取通配符前后的字串,若两字串都为value的字串,那么返回true;这个做法只适用于patern中只有一个*的情况,多个及多种通配符的情况可你自己修改算法,不是太复杂。我的思路是解析patern,通过递归逐级对比value。
    ----------------------------------------------
                       riff ur life
      

  7.   

    根据ahuige和tweety的思路,我写出了以下算法。此算法只适用于Patern中有一个"*" 和/或 一个或几个"?"的情况。虽然不适用于所有情况,但是对于目前我要达到的用途已经足够了。如果还有高人有更优、更通用的算法,欢迎指点!function MatchPatern(Value, Patern: string): Boolean;
    var s: string;
    begin
      Result := False;
      s := Patern;  // 替换全部的"?"
      while (Pos('?', s) <> 0) do
        s := StringReplace(s, '?', Value[Pos('?',s)], []);
      if s = Value then
      begin
        Result := True;
        Exit;
      end;  // 替换"*"
      if Pos('*', s) <> 0 then
      begin
        s := StringReplace(s, '*', Copy(Value, Pos('*', s), Length(Value)-Length(s)+1), []);
        if s = Value then
        begin
          Result := True;
          Exit;
        end;
      end;
    end;