2012-03-30 2 views
0

Le problème que j'ai est que j'utilise isInfixOf sur une chaîne ci-dessous pour vérifier si le mot que je cherche est dans la chaîne, le ci-dessous fonctionne jusqu'à un certain point.isInfixOf et trouver une chaîne dans une chaîne

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

mais si cela fait partie d'un autre mot, il retourne toujours TRUE comme ci-dessous:

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

J'essaie de savoir si le mot transmis est dans la chaîne Je cherche mais ne fait pas partie d'une autre chanson.

J'ai essayé beaucoup de méthodes mais je ne sais pas comment je pourrais m'assurer que le mot ne fait pas partie d'un autre mot.

WORDS ne fonctionne pas car il ne supprime pas la chaîne de son caractère Punc.

Répondre

0

Certains packages d'expressions régulières peuvent être utiles ici.

Par exemple, en utilisant regex-prce-builtin.

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

\\b est synonyme de \b limite de mot, qui est utilisé dans des expressions régulières Perl.

Nous pouvons donc définir un nouveau isInfixOf analogique en utilisant (=~).

> 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

Vous pouvez utiliser une approche différente. La fonction words crée une liste de chaînes contenant tous les mots d'une chaîne. La fonction elem indique si quelque chose fait partie d'une liste. Ainsi, vous pouvez utiliser elem "world" (words "hello world"). Il existe d'autres solutions impliquant des expressions régulières, mais celle-ci est probablement la plus simple.

+1

Il convient de noter que == 'mots "bonjour, monde"[ "bonjour", "monde"]' (la ponctuation n'est pas dépouillé). – huon

+1

@dbaupp La fonction 'splitOneOf' de [' split'] (http://hackage.haskell.org/packages/archive/split/0.1.4.2/doc/html/Data-List-Split.html#v:splitOneOf) peut aider à résoudre ce problème. –

Questions connexes