当掩码包含"["时,如何使用TMask?

Lob*_*uno 3 delphi wildcard

我在Delphi 2010中一直在试验TMask,它似乎按预期工作,除了在一种情况下:当掩码名称包含[或]时,掩码似乎总是返回false.例如:

var
  MaskObj : TMask;
begin
  MaskObj:= TMask.Create('c:\[test]\*');
  try
    Result:= MaskObj.Matches('c:\[test]\text');
  finally
    FreeAndNil(MaskObj);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

返回false....

是的,[和]是文件名中的合法字符.因此,如果我想排除例如c:[test]*中的所有文件,我该怎么办?我唯一的解决方案是在检测到[但是这对于大量文件来说会很慢时执行StringReplace :

if (pos('[', Mask)>0) then
begin
  mask:= ReplaceString(Mask, '[','_', etc...
  // and do the same for the file name---
end;
Run Code Online (Sandbox Code Playgroud)

还有其他方法吗?

Zoë*_*son 5

'['用于标记一组字符的开头(例如,"[AZ]").为了匹配'[',你只需要将它创建为自己的单字符集.'''不需要进行类似的转义,因为一旦找到前导'[',它只是一个特殊字符.尝试C:\[[]test]\*

编辑:

如果您允许使用任意掩码,则需要使用StringReplace(Mask, '[', '[[]', [rfReplaceAll])掩码,但不能使用文件名.如果你从不使用[a-z]通配符,我只是从TMask下载并在构造函数中处理它.