Parsec wie man "Übereinstimmungen" innerhalb eines Strings findet
Wie kann ich parsec verwenden, um alle übereinstimmenden Eingaben in einer Zeichenfolge zu analysieren und den Rest zu verwerfen?
Beispiel: Ich habe einen einfachen Zahlenparser und kann alle Zahlen finden, wenn ich weiß, was sie voneinander trennt:
num :: Parser Int
num = read <num :: Parser Int
num = read <$> many digit
parse (num `sepBy` space) "" "111 4 22"
gt; many digit
parse (num `sepBy` space) "" "111 4 22"
Aber was ist, wenn ich nicht weiß, was zwischen den Zahlen ist?
"I will live to be 111 years <b>old</b> if I work out 4 days a week starting at 22."
many anyChar
funktioniert nicht als Trennzeichen, weil es alles verbraucht.
Wie kann ich also Dinge erhalten, die mit einem beliebigen Parser übereinstimmen, der von Dingen umgeben ist, die ich ignorieren möchte?
BEARBEITE: Beachten Sie, dass mein Parser im eigentlichen Problem komplizierter ist:
optionTag :: Parser Fragment
optionTag = do
string "<option"
manyTill anyChar (string "value=")
n <- many1 digit
manyTill anyChar (char '>')
chapterPrefix
text <- many1 (noneOf "<>")
return $ Option (read n) text
where
chapterPrefix = many digit >> char '.' >> many space