文件扩展名(extname)我有一个Text
或String
包含文件名的,说/foo/bar/foobar.txt
。从提取文本或字符串
我如何定义一个函数extname
(类似于NodeJS's extname,但省略了前导点),只有产生了延伸
注(txt
的例子吗?):这个问题被回答的问& A-风格,因此不显示研究工作。而不是downvoting,请添加评论你想要改进。
文件扩展名(extname)我有一个Text
或String
包含文件名的,说/foo/bar/foobar.txt
。从提取文本或字符串
我如何定义一个函数extname
(类似于NodeJS's extname,但省略了前导点),只有产生了延伸
注(txt
的例子吗?):这个问题被回答的问& A-风格,因此不显示研究工作。而不是downvoting,请添加评论你想要改进。
另一种方法是使用System.Filepath
:
λ> import System.FilePath
λ> snd $ splitExtension "/foo/bar/foobar.txt"
".txt"
您还可以使用takeExtension
尖的out by @kosmikus:
λ> takeExtension "/foo/bar/foobar.txt"
".txt"
您可以定义的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"
。
这一具体问题可以通过组合extname
与basename
(我就只会显示,特立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
谢谢,你的解决方案似乎比我的更好。我只为'extname'而不是'splitExtension'输入。 –
你也可以使用'takeExtension'。 – kosmikus
@kosmikus谢谢!更新了答案。 – Sibi