2012-03-30 4 views
0

문제는 내가 찾고있는 단어가 아래의 문자열인지 확인하기 위해 아래의 문자열에 isInfixOf을 사용하고 있다는 것입니다. 아래에서 특정 지점까지 작동합니다.isInfixOf 및 문자열 내에서 문자열 찾기

> "world" `isInfixOf` "hello world" 
True 

하지만 또 다른 단어의 일부의 경우 여전히 다음과 같이 TRUE를 반환 : 내가 전달 된 단어가 문자열에 있는지 여부를 확인하기 위해 노력하고

> "wor" `isInfixOf` "hello world" 
True 

나는 그것을하지만 찾고 있어요 다른 노래의 일부가 아닙니다.

나는 많은 방법을 시도했지만 단어가 다른 단어의 일부가 아닌지 어떻게 확신 할 수 있는지 잘 모르겠습니다.

단어는 punc 문자의 문자열을 제거하지 않으므로 작동하지 않습니다.

답변

0

일부 정규식 패키지가 유용 할 수 있습니다.

예를 들어 regex-prce-builtin을 사용하십시오.

> :m + Text.Regex.PCRE 
> "Hello world" =~ "\\bworld\\b" :: Bool 
True 
it :: Bool 
> "Hello world" =~ "\\bwor\\b" :: Bool 
False 

\\b는 펄 정규 표현식에 사용되는 \b 단어 경계를 의미합니다.

그래서 우리는 (=~)을 사용하여 새로운 isInfixOf 아날로그를 정의 할 수 있습니다.

> let s `isInfixOf_` l = l =~ ("\\b" ++ s ++ "\\b") :: Bool 
isInfixOf_ :: RegexLike Regex source1 => [Char] -> source1 -> Bool 
> "wor" `isInfixOf_` "Hello world" 
False 
it :: Bool 
> "world" `isInfixOf_` "Hello world" 
True 
it :: Bool 
8

다른 접근 방법을 사용할 수 있습니다. words 함수는 문자열의 모든 단어를 포함하는 문자열 목록을 만듭니다. elem 함수는 뭔가가 목록의 일부인지 여부를 알려줍니다. 따라서 elem "world" (words "hello world")을 사용할 수 있습니다. 정규식을 포함하는 다른 솔루션이 있지만이 방법이 가장 간단합니다.

+1

그것은 주목해야한다 '단어 "여러분 안녕하세요"== "안녕하세요", "세계"]'(구두점 제거되지 않는다). – huon

+1

@dbaupp [splitto]의'splitOneOf' 함수 (http://hackage.haskell.org/packages/archive/split/0.1.4.2/doc/html/Data-List-Split.html#v:splitOneOf)이 문제를 해결하는 데 도움이 될 수 있습니다. –

관련 문제