2012-01-12 137 views
4

我正在尋找一種簡單而強大的方法來實現Windows風格的*?通配符在字符串中匹配。尋找簡單但功能強大的windows通配符(`*,?`)匹配實現

BeginsWith()EndsWith()太簡單了,無法覆蓋所有情況,而將通配符表達式轉換爲正則表達式看起來很複雜,我不確定性能。

想要一個快樂的媒介。

編輯:我試圖解析.gitignore文件,並匹配相同的文件,因爲Git。這意味着:

  • 文件應該是出庫的索引(所以我檢查存儲在索引對一個文件的路徑)
  • .gitignore數的模式可以很大;
  • 要檢查的文件數量可能也很大。
+3

非常含糊。發佈一些具有所需輸出的輸入。 – 2012-01-12 21:25:09

+1

@亨克,大多數窗口的人會知道什麼意思,*任何數量的字符,?只是一個未知的字符...?blah * .txt會匹配任何與之前的字符的任何東西,任何數量的字符後,等等,並以.txt結尾 – 2012-01-12 21:29:49

+0

@HenkHolterman,我解析'.gitignore'文件,並在我的庫我需要達到原始Git提供的相同行爲。 – shytikov 2012-01-12 21:37:32

回答

4

的Windows等同通配符?和正則表達式*只是..*


[編輯]鑑於你的新的編輯(認爲你正在尋找實際文件),我會完全跳過翻譯,讓.NET進行使用Directory.GetFiles()搜索。

(注意,出於某種原因,路過一個?Directory.GetFiles()比賽「零個或一個字符,」 而在Windows中,它總是匹配一個字符)

+0

個人意見,我不喜歡這個想法轉化爲正則表達式。因爲很多東西也需要翻譯。例如點,大括號,他們需要逃脫。而且我不能保證用戶輸入他們的通配符是準確的。這使得方法變得複雜。 – shytikov 2012-01-12 21:39:07

+4

編寫自己的模式匹配比翻譯爲正則表達式要複雜得多。 – CodesInChaos 2012-01-12 21:45:19

+1

@Alexey:請參閱[Regex.Escape()](http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.escape.aspx) – 2012-01-12 21:53:08

1

轉換*和?正則表達式很容易。
對於?更換 」?」與「。{1}」 ,並*用「。+?」替換「*」

這應該會得到與Windows上通配符匹配相同的行爲。編輯: boolean PathMatchSpec(input, pattern)將完成這項工作。

Private Declare Auto Function PathMatchSpec Lib "shlwapi" (ByVal pszFileParam As String, ByVal pszSpec As String) As Boolean 
+0

是的,這很容易,但是有沒有其他方法可以將一種模式轉換爲另一種模式? – shytikov 2012-01-12 21:33:50

+3

您還需要轉義在正則表達式中具有特殊含義的字符。 – CodesInChaos 2012-01-12 21:36:14

+0

好點@CodeInChaos – 2012-01-12 21:37:57

1

你應該基於正則表達式的方法去除非你的數據量很大,或者你有數據點說正則表達式會嚴重影響性能。

如果是這樣的話,任何其他解決方案也有可能影響性能,你可能會需要手工卷的東西。

2

要獲得包括所有角落的情況下精確匹配,使用

System.IO.Directory.GetFiles(myPath, myPattern) 

您可能需要創建一些臨時文件第一次形成的targetstrings。

換句話說,我認爲你應該讓你的模式幹,直到它的時間,以滿足filesytem。

+0

對我而言,這幾乎沒用,因爲我以您的方式獲取文件夾中的所有文件指出,比我檢查Git索引中有多少人。在剩下的文件中,我搜索這些與'.gitignore'中的模式不匹配的文件。 – shytikov 2012-01-13 07:50:21