2014-04-20 133 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