Nicht sicher, ob dies möglich ist (oder empfohlen), aber ich versuche im Wesentlichen mit Parsec nach einer Zeichenfolge in der Datei zu suchen. Beispieldatei:Suche nach einem Muster mit 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
Und hier ist mein Versuch, es immer Arbeit:
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")
Ich versuche, durch die Suche nach careAbout
die Suche zwingen Brute, und wenn das nicht funktioniert, essen ein Zeichen und versuche es erneut. Ich könnte den ganzen Kram in der Mitte analysieren (ich weiß, was es sein könnte), aber ich interessiere mich nicht dafür, was es ist (also warum sollte ich es analysieren), und es ist möglicherweise kompliziert.
Problem ist, meine Lösung funktioniert nicht ganz. anyChar
endet alles verbraucht, und die Suche nach END
bekommt nie eine Chance. Auch irgendwo in der careAbout
schlagen wir eof
und einige Exception
wird wegen ihm geworfen.
Dies ist wahrscheinlich die genaue falsche Art und Weise, es zu tun, und ich würde gerne von eine Weg oder noch besser, der Right Way ™, es zu tun wissen.