2013-04-24 91 views
2

我有一種方法,允許用戶指定一個遠程目錄和一個帶有with的searchPattern來搜索遠程目錄中的文件。由於我在從遠程位置檢索文件名時使用了第三方庫,因此我無法利用System.IO的Directory.GetFiles()例程,該例程允許我在獲取文件時指定searchPattern。使用基本字符串操作的字符串模式匹配

基本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; 
} 

在此先感謝。

+0

請具體說明與要求。就像你如何稱這種方法一樣? – 2013-04-24 16:36:17

+1

正則表達式?有數千種在線搜索模式。 – 2013-04-24 16:37:26

+0

@NikhilAgrawal - 我認爲不重要。這個問題的本質似乎是「我如何glob匹配字符串」 – Bobson 2013-04-24 16:38:02

回答

6

與通配符匹配的文件(*,?)被稱爲「glob」匹配或「通配符」。您可以嘗試將用戶輸入的全局搜索轉換爲正則表達式,然後使用它。這裏有一個例子here

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

這將隨後獲得通過爲RegEx.Match()的模式,在那裏你目前有String.Compare()

+1

+1我剛剛爲我的答案添加了一條關於此的註釋。 – 2013-04-24 16:42:53

+0

那麼在SearchPattern類似24April2013 ## _ *。mp4的情況下會發生什麼? – Kobojunkie 2013-04-24 16:49:35

+0

我假設'#'應該代表一個數字?你會添加另一個'.Replace(「#」,@「\ d」)'到最後將它轉換爲正則表達式版本。 – Bobson 2013-04-24 16:54:29

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的答案。

+0

這要求輸入搜索字符串的最終用戶知道正則表達式。 – Bobson 2013-04-24 16:40:32