2012-03-30 16 views
0

Das Problem, das ich habe, ist, dass ich isInfixOf auf eine Zeichenfolge unten verwenden, um zu überprüfen, ob das Wort, das ich suche, innerhalb der Zeichenfolge ist, funktioniert die unten bis zu einem bestimmten Punkt.isInfixOf und eine Zeichenfolge in einer Zeichenfolge zu finden

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

aber was, wenn es Teil eines anderen Wortes ist gibt es immer noch TRUE wie folgt:

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

ich, um herauszufinden, ich versuche, ob die in ist vergangen Wort in der Zeichenfolge ich suche es aber ist nicht Teil eines anderen Liedes.

Ich habe viele Methoden ausprobiert, aber ich bin nicht sicher, wie ich sicherstellen konnte, dass das Wort nicht Teil eines anderen Wortes ist.

WÖRTER funktioniert nicht, weil es nicht die Zeichenfolge seines Punc-Zeichens entfernt.

Antwort

0

Einige Pakete für reguläre Ausdrücke könnten hier hilfreich sein.

Zum Beispiel mit regex-prce-builtin.

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

\\b steht für \b Wortgrenze, die in Perl reguläre Ausdrücke verwendet wird.

So können wir neue isInfixOf Analog mit (=~) definieren.

> 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

Sie können einen anderen Ansatz verwenden. Die words Funktion erstellt eine Liste der Zeichenfolgen, die alle Wörter in einer Zeichenfolge enthält. Die elem Funktion sagt aus, ob etwas Teil einer Liste ist. Also könnten Sie elem "world" (words "hello world") verwenden. Es gibt andere Lösungen mit regulären Ausdrücken, aber diese ist wahrscheinlich die einfachste.

+1

Es sollte beachtet werden, dass 'Wörter" Hallo, Welt "== [" Hallo, "," Welt "]' (Interpunktion wird nicht entfernt). – huon

+1

@dbaupp Die Funktion 'splitOneOf' aus [' split'] (http://hackage.haskell.org/packages/archive/split/0.1.4.2/doc/html/Data-List-Split.html#v:splitOneOf) kann helfen, dieses Problem zu lösen. –

Verwandte Themen