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

时间:2013-04-24 16:34:24

标签: c# .net string pattern-matching match

我有一个方法允许用户指定远程目录和带有with的searchPattern来搜索远程目录中的文件。由于我在从远程位置检索文件名时使用第三方库,因此无法利用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;
}

提前致谢。

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分: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 的答案。