2010-12-10 3 views
5

필자는 부수적 인 스크립트 등을 작성하여 일상 생활에 하스켈을 소개하고자합니다.하스켈의 정규 표현식 및 문자열 라이브러리

readProcess은 외부 명령의 결과를 얻는 데 편리하지만 문자열 결과 처리는 언제든지 수행합니다. 저는 정규 표현식이 일류 인 루비에서 왔기 때문에, 저는 그것들을 도구로 사용하는 데 익숙합니다.

haskell에서 문자열 처리를 위해 읽어야하는 라이브러리는 무엇입니까? 일치하는 줄을 찾고 문자열의 일치하는 영역을 추출하는 등의 작업을 수행합니까? 정규 표현식에

+1

haskell 위키에 대한 훌륭한 설문 조사를 찾을 수 있습니다 : http://www.haskell.org/haskellwiki/Regular_expressions –

답변

4

나는 이것을 좋은 출발점으로 생각한다 : http://www.serpentine.com/blog/2007/02/27/a-haskell-regular-expression-tutorial/ 고급 주제는 없지만 기본 내용 만 다루지 만 좋은 주제는 아니다. IMHO를 시작하십시오.

유의할 것들 : 하스켈

  • 정규 표현식에 그들이 반환 형식을 오버로드한다는 점에서 다르다. 이것은 당신이 정규식 매치에서 많은 다른 종류의 것을 끌어낼 수 있다는 것을 의미합니다. (Bool, String, [String] 등 ...) 사용하는 반환 유형에 따라 다른 종류의 대답 (정규식 일치 여부, 일치 여부 테스트, 모든 일치하는 하위 그룹, 이것은 꽤 복잡한 typeclass 부두를 사용하여 수행됩니다. 위의 링크는 기본적인 종류를 보여줍니다. 더 완전한리스트는 here
  • 입니다. 실제로는 정규식 지원 (이상하지만 사실)을 제공하는 여러 표준 모듈이 haskell에 있습니다.위의 튜토리얼은 POSIX 모듈을 보여줍니다. POSIX 모듈은 haskell에 표준으로 포함되어 있기 때문입니다. 음모가 있다면, 당신은 꽤 쉽게 다른 regex 모듈을 설치해서 대신 사용할 수 있습니다. pcre 바인딩 (regex-pcre)과 DFA를 통해 작동하는 패키지 (regex-dfa 등)가 있습니다. 다음과 같은 명령을 사용하여 설치하십시오 : cabal install regex-pcre 당신은 잘 가야합니다.
  • 하스켈에서 정규식 객체 IS (모듈은 표준화 된 인터페이스를 가지고, 그 차이는 구현 및 정규식 맛에 주로),하지만 당신은 정말 사용하도록 필요하지 않습니다 = ~ or = ~~ 일치 연산자. (단지 문자열을 사용하면 자동으로 변환이 발생합니다). 만약 당신의 작업이 첫번째 클래스 파싱 객체를 원하기에 충분히 복잡하다면, 다른 대답에서 언급 된 것처럼 Parsec을 조사하는 것을 고려해보십시오.

실례 : 필자는 실제로 사용자 pcre 만 사용하므로 다른 패키지에 대해 많이 알지 못합니다.

3

좋은 소개 Realworld Haskell

업데이트에서 찾을 수있다 : 보조 노트에, 명령 처리 및 파이프와 같은 체크 아웃 HSH을 위해.

0

하스켈에는 훌륭한 정규 표현식 라이브러리가 많이 있지만, 우리는 더 나은 도구를 가지고 있습니다. 현재 표준 Haskell Strings (즉, Char 목록)를 고수 해보자. 기본 사항은 모두 Data.List - http://www.haskell.org/ghc/docs/latest/html/libraries/base-4.3.0.0/Data-List.html에 있습니다. 당신은 라인, unlines, 단어, unwords, takewhile, dropwhile, etc.etc 있습니다. 또한 isPrefixOfisInfixOf

결국 직접적으로 고유 한 재귀 함수를 작성하게 될지도 모르겠지만 그 역시 간단합니다. 정말 실종 된 작업은 브렌트의 훌륭한 패키지를 사용할 수있는 브렌트의 뛰어난 패키지를 분리하는 작업입니다. http://hackage.haskell.org/package/split

근본적으로는 문자 스트림의 증분 처리를 원한다는 개념입니다.

특히 문자열 표현이 효율적이지 않기 때문에 모든 것이 가능한 효율적이지는 않습니다. 그러나 다른 데이터 유형으로 이동하는 경우, 물건을 처리하는 방법의 핵심 개념이 기본 문자열에서 직접 변환됩니다.

+0

문자열의'tails '에'isPrefixOf'를 사용하면 더 좋지 않습니다. 그것은 필자가 PITA로 작성하는 것 이상으로 좋은 문자열 매치 처보다 느립니다. – rampion

+0

"모든 것이 가능한 한 효율적이지는 않다"고 말했기 때문에. 'isInfixOf'는 실제로 제가 언급 한 것입니다. 그 "PITA"의 그다지 쓰지 않는 그 거의. 그리고 제가 말씀 드렸듯이, 핵심 개념은 직설적으로 번역됩니다. – sclv

+1

@rampion : "좋은 문자열 일치 자"와 관련이있는 시점에'[Char] '를 전혀 사용하지 않아야한다고 덧붙여 야합니다 - Data.Text에는 좋은 정규 표현자가 있습니다 상자 밖에서, 그리고 바이트 스크립트를위한 훌륭한 하위 문자열 검색 패키지가 있습니다. – sclv

3

내가 처음 하스켈에게 가르쳤을 때 나는 문자열 처리를 위해 파서 결합 자 라이브러리를 사용하는 것을 배우는 것이 환상적인 투자 였음을 발견했다. 그들은 정규 표현식이 할 수있는 모든 것을, 그리고 훨씬 더, 쓰기 콤비 파서를 할 수있는 것은 내가이 일 Attoparsec을 사용하는 경향이 큰 모나드, 실용적 펑 같은 유형의 클래스에 대한 직관을 구축하는 방법 등

이지만, Parsec

+0

아직 "파섹 (Parsec)"장에 도달하지 못했지만, 앞으로도 기대됩니다. :) –

+0

좋은 생각 같네요. – rampion