これが可能かどうかはわかりませんが、Parsecを使用してファイルの文字列を検索しようとしています。サンプルファイル:Parsecでパターンを検索する
START (name)
junk
morejunk=junk;
dontcare
foo()
bar
care_about this (stuff in here i dont care about);
don't care about this
or this
foo = bar;
also_care
about_this
(dont care whats in here);
and_this too(only the names
at the front
do i care about
);
foobar
may hit something = perhaps maybe (like this);
foobar
END
そして、ここではそれが働いて得ることで私の試みです:
careAbout :: Parser (String, String)
careAbout = do
name1 <- many1 (noneOf " \n\r")
skipMany space
name2 <- many1 (noneOf " (\r\n")
skipMany space
skipMany1 parens
skipMany space
char ';'
return (name1, name2)
parens :: Parser()
parens = do
char '('
many (parens <|> skipMany1 (noneOf "()"))
char ')'
return()
parseFile = do
manyTill (do
try careAbout <|>
anyChar >> return ("", "")) (try $ string "END")
私はcareAbout
を探して検索を強制し、それが動作しない場合は、食べブルートしようとしています1文字を入力してもう一度お試しください。私は真ん中のすべての迷惑メールを解析することができますが、私はそれが何であるか気にしません(なぜそれを解析するのがなぜか)、それは潜在的に複雑です。
問題は、私の解決策がうまくいかないことです。 anyChar
はすべてを消費してしまい、END
の検索では決してチャンスがありません。また、careAbout
のどこかで、eof
に達し、そのためにException
が投げられます。
これはおそらく間違ったやり方であり、の方法、またはそれより優れた方法であることを知りたいと思います。