从Text或String中提取文件扩展名(extname)

时间:2014-04-20 17:08:50

标签: haskell

我有TextString包含文件名,例如/foo/bar/foobar.txt

如何定义一个函数extname(类似于NodeJS's extname,但省略前导点),只产生扩展名(txt为示例?)

注意:此问题已回答Q& A-Style,因此未显示研究工作。请注意您要改进的内容,而不是低估。

2 个答案:

答案 0 :(得分:4)

另一种方法是使用System.Filepath

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

您也可以使用@kosmikus指出的takeExtension

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

答案 1 :(得分: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