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

Antworten auf die Frage(6)

Ihre Antwort auf die Frage