2016-04-05 10 views
-1

Ich versuche, ein Problem mit Parsing-Muster aus einer Zeichenfolge in Haskell zu lösen.Haskell - Analysieren bestimmter Muster aus einer Zeichenfolge

die folgende Zeichenfolge Gegeben:

s = "/show\ hello how are /dont\ you /;dont\ doing /;show\" 

Das Programm, bis die Suche nach ‚/‘ dann Inhalt halten gefunden, bis der Suche nach ‚\‘ lesen würde. Der Inhalt wird mit einer Liste von genehmigten Wörtern verglichen, die ich bereits sortiert habe.

Das Problem, das ich habe, besteht eigentlich darin, den Inhalt von der Zeichenfolge zu analysieren und daran festzuhalten, um die erforderlichen Prüfungen durchzuführen.

Wie würde ich das machen?

Danke.

+2

Strings sind Listen, so dass die Liste Funktionen in Vorspiel, wie 'takeWhile' verwenden, das Problem einen Schritt zu einer Zeit, in Angriff zu nehmen, dann die Schritte kombinieren, bis Sie das bekommen Lösung. Oder Sie schauen in Parsec. – MicroVirus

Antwort

1

Es gibt viele Möglichkeiten, diese Katze zu häuten. Hier ist ein Hinweis auf eine besonders schnelle und schmutzige Art und Weise:

Text.Regex.TDFA> let s = "/show\\ hellow how are /dont\\ you /;dont\\ doing /;show\\" 
Text.Regex.TDFA> s =~ "/[^/\\]*\\\\" :: [[String]] 
[["/show\\"],["/dont\\"],["/;dont\\"],["/;show\\"]] 
0

Als Daniel Wagner in seiner Antwort schrieb, gibt es viele Möglichkeiten, um diese Katze zu Haut, und die Art, wie er Häute zeigten eine sehr kernig. Wie jedoch MicroVirus im Kommentar darauf hingewiesen hat, sind Haskell-Strings im Wesentlichen Listen, weshalb der Vollständigkeit halber hier ohne Bibliotheken vorgegangen wird.

Angenommen, wir zuerst tilSlash definieren, die ein String nimmt, und gibt ein Tuple deren fst ist der Rest der String nach dem einschließenden Schrägstrich und deren snd ist das Token bis zum umschließenden slash:

tilSlash :: String -> String -> (String, String) 
tilSlash ('\\':ss) til = (ss, til) 
tilSlash ('/':_) _ = error "unmatched" 
tilSlash (s:ss) til = (rest, (s: endTil)) where 
    (rest, endTil) = tilSlash ss 

Zur Veranschaulichung:

s = "/show\\ hello how are /dont\\ you /;dont\\ doing /;show\\" 
>>> tilSlash (tail s) [] 
(" hello how are /dont\\ you /;dont\\ doing /;show\\","show") 

diese verwenden, können wir parseSlashes definieren:

parseSlashes :: String -> [String] 
parseSlashes [] = [] 
parseSlashes ('/': ss) = tok: (parseSlashes rest) where 
    (rest, tok) = tilSlash ss [] 
parseSlashes ('\\': _) = error "unmatched" 
parseSlashes (_: ss) = parseSlashes ss 

auf Ihrer Eingabe:

>>> parseSlashes s 
["show","dont",";dont",";show"] 
Verwandte Themen