2014-04-20 90 views
0

文件扩展名(extname)我有一个TextString包含文件名的,说/foo/bar/foobar.txt从提取文本或字符串

我如何定义一个函数extname(类似于NodeJS's extname,但省略了前导点),只有产生了延伸

注(txt的例子吗?):这个问题被回答的问& A-风格,因此不显示研究工作。而不是downvoting,请添加评论你想要改进。

回答

4

另一种方法是使用System.Filepath

λ> import System.FilePath 
λ> snd $ splitExtension "/foo/bar/foobar.txt" 
".txt" 

您还可以使用takeExtension尖的out by @kosmikus:

λ> takeExtension "/foo/bar/foobar.txt" 
".txt" 
+0

谢谢,你的解决方案似乎比我的更好。我只为'extname'而不是'splitExtension'输入。 –

+0

你也可以使用'takeExtension'。 – kosmikus

+0

@kosmikus谢谢!更新了答案。 – Sibi

1

您可以定义的extname这样一个基本的版本:

{-# LANGUAGE OverloadedStrings #-} 
import Data.Text (Text) 
import qualified Data.Text as T 

extname :: Text -> Text 
extname = T.reverse . T.takeWhile ((/=) '.') . T.reverse 

String(别名为FilePath):

extname :: FilePath -> FilePath 
extname = reverse . takeWhile ((/=) '.') . reverse 

extname一个可能的问题是如何处理错误(即什么是你的正确错误处理的定义)。例如,这里发布的函数将返回包含路径的整个文件名,如果函数中没有点。

例如,extname "/etc/foo.d/config" == "d/config"

这一具体问题可以通过组合extnamebasename(我就只会显示,特立Text版本)来解决:

import Filesystem.Path.CurrentOS (fromText, toText) 
import Filesystem.Path (basename) 

extname' = extname . toText . basename . fromText 

产生extname' "/etc/foo.d/config" == "config"

如果需要前导点(即模仿的NodeJS行为),用途:

import Data.Monoid (mappend) 

extnameWithDot filename = "." `mappend` extname' filename