文件擴展名(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