2016-04-05 11 views
-1

ハスケルの文字列からパターンを解析する際の問題を解決しようとしています。Haskell - 文字列から特定のパターンを解析する

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

プログラムが「/」を「\」見つけるまで見つかったコンテンツを保持見つけるまで読んでいました:

は、次の文字列を与えられました。内容は、すでにソートした承認済みの単語のリストと比較されます。

私が抱えている問題は、実際には文字列からコンテンツを解析し、必要なチェックを実行することです。

どうすればいいですか?

ありがとうございました。

+2

文字列のリストなので、あなたが取得するまでのステップを組み合わせて、その後、一度問題を一段階に取り組むために、このようなtakeWhile' 'として、プレリュードでリスト機能を使用します溶液。または、Parsecを調べます。 – MicroVirus

答えて

1

この猫には多くの方法があります。ダニエル・ワグナーが彼の答えに書いたように

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

は、この猫を肌には多くの方法があり、彼は非常にpithilyスキンを示した方法:ここでは特に迅速かつ汚い方法のためのヒントがあります。しかし、コメントにMicroVirusが指摘しているように、Haskellの文字列は本質的にリストなので、完全性のために、ライブラリなしでこれを行う方法があります。

我々は最初のStringを取り、そのfst囲むスラッシュの後のStringの残りの部分があるタプルを返し、そのsndトークンは、囲むスラッシュまでであることtilSlashを定義するとします

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 

説明のため:

:これを使用して

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

、我々はparseSlashesを定義することができますあなたの入力時に

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

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