2

我有一个方法,允许用户指定一个远程目录和一个 searchPattern with with 来搜索远程目录中的文件。由于我在从远程位置检索文件名时使用第三方库,因此我无法利用 System.IO 的 Directory.GetFiles() 例程,它允许我在获取文件时指定 searchPattern。

Basic String.Compare 未将文件名与提供的模式正确匹配。请问有人知道更有效的匹配方法吗?

public IList<String> GetMatchingRemoteFiles(String SearchPattern, bool ignoreCase)
{
    IList<String> matchingFileNames = new List<String>();

   var RemoteFiles = thirdPartyTool.ftpClient.GetCurrentDirectoryContents();

    foreach( String filename in RemoteFiles)
     if( String.Compare(filename, SearchPattern, ignoreCase) == 0)
            matchingFileNames.Add(filename);

    return matchingFileNames;
}

提前致谢。

4

2 回答 2

6

使用通配符 ( *, ?) 匹配的文件称为“glob”匹配或“globbing”。您可以尝试将用户输入的全局搜索转换为正则表达式,然后使用它。这里有一个例子:

Regex.Escape( wildcardExpression ).Replace( @"\*", ".*" ).Replace( @"\?", "." );

然后,这将RegEx.Match()作为模式传递给您当前拥有的模式String.Compare()

于 2013-04-24T16:40:05.400 回答
2

如果您可以指定此方法将接受哪些类型的搜索字符串,则可以使用正则表达式。为了简洁起见,这是一个使用 Linq 的示例:

public IList<String> GetMatchingRemoteFiles(String SearchPattern, bool ignoreCase)
{
    var options = ignoreCase ? RegexOptions.IgnoreCase : RegexOptions.None;
    return thirdPartyTool.ftpClient.GetCurrentDirectoryContents()
                         .Where(fn => Regex.Matches(fn, SearchPattern, options))
                         .ToList();
}

即使您无法控制此方法接受哪些类型的搜索字符串,将搜索字符串转换为正则表达式仍然可能比编写您自己的算法来匹配模式更容易。有关如何执行此操作的详细信息,请参阅Bobson的答案。

于 2013-04-24T16:39:41.540 回答