2013-05-17 69 views
2

我想基於正則表達式篩選[[String]]。過濾[[String]]與正則表達式和模式匹配

filter (\fn -> case (matchRegex (mkRegex "*.exe") fn) of Nothing -> False 
                 Just _ -> True) 
     directory_info 

不幸的是,這裏的lambda函數在語法上是無效的:根據ghc,表達式上下文中不會出現模式匹配。

這應該如何改寫以簡潔地執行預期的含義?

+2

我不從,爲什麼你得到錯誤從代碼理解(我會用哈馬爾的答案反正去),但你可以通過使用'從Data.Maybe isJust'避免模式匹配。 – dave4420

回答

12

爲什麼在有System.FilePath時使用正則表達式?在這種情況下,請嘗試使用takeExtension函數。

filter (\fn -> takeExtension fn == ".exe") directory_info 
+0

絕對是最好的方法。在這種情況下,正則表達式不是最好的工具。 – AndrewC

4

如果您只有在匹配時纔有興趣,可以使用matchTest而不是matchRegex

6

首先,你的正則表達式是錯誤的。它應該是".*\\.exe"。你使用的是所謂的globbing。

其次,嘗試使用=~語法代替,例如here

例如,這應該工作:

filter (\fn -> fn =~ ".*\\.exe" :: Bool) directory_info 

而且,你不必使用lambda。把它變成一個功能,它可能會工作。