2014-04-20 11 views
0

Text 또는 String의 파일 이름 (예 : /foo/bar/foobar.txt)이 있습니다. 난 단지 확장 산출 extname (NodeJS's extname와 유사하지만, 선행 점을 생략) 함수 정의 할 수 있습니까텍스트 또는 문자열에서 파일 확장명 (extname) 추출

참고합니다 (예를 들어 txt을?) :이 질문에 대답했다 Q & A- 스타일이므로 연구 노력을 보이지 않습니다. downvoting 대신 개선하고 싶은 의견을 추가하십시오.

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

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

또는이 String을 위해 (FilePath 별칭) :

답변

4

는 또 다른 방법은 System.Filepath 사용하는 것 @kosmikus님께 서 :

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

감사합니다. 솔루션은 내 것보다 나은 것 같습니다. 나는 'extname'에 대해서만 호이설을했지만'splitExtension'에 대해서는 그렇지 않다. –

+0

그냥'takeExtension'을 사용할 수도 있습니다. – kosmikus

+0

@kosmikus 감사합니다. 답변을 업데이트했습니다. – Sibi

1

당신은이 같은 extname의 기본 버전을 정의 할 수 있습니다

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

extname의 발생 가능한 문제가 오류를 처리하는 방법 (즉, 의 정의가 정확합니까? 오류 처리). 여기에 게시 된 함수는 예를 들어 함수에 점이 없으면 path를 포함한 전체 파일 이름을 반환합니다. 예 : extname "/etc/foo.d/config" == "d/config".

이 특정 문제

는 (I은 이에 관해서에서 Text 버전을 보여줄 것) basenameextname을 결합하여 해결할 수 있습니다

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

extname' = extname . toText . basename . fromText 

extname' "/etc/foo.d/config" == "config"를 산출.

선도적 인 도트가 필요한 경우 (즉,이 NodeJS 동작을 모방하는) 사용 :

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

또한 지적 takeExtension를 사용할 수 있습니다

import Data.Monoid (mappend) 

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