使用基本字符串操作的字符串模式匹配

本文关键字:字符串 操作 模式匹配 | 更新日期: 2023-09-27 18:10:48

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

基本的字符串。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;
}

使用基本字符串操作的字符串模式匹配

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

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

这将被传递到RegEx.Match()作为模式,在那里你目前有String.Compare()

如果您可以指定此方法将接受哪种类型的搜索字符串,则可以使用正则表达式。为了简洁,下面是一个同样使用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的回答。