2013-05-17 30 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。把它变成一个功能,它可能会工作。