Parsec как найти «совпадения» внутри строки
Как я могу использовать parsec, чтобы проанализировать все совпадающие входные данные в строке и отбросить остальные?
Пример: у меня есть простой анализатор чисел, и я могу найти все числа, если я знаю, что их разделяет:
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"
Но что, если я не знаю, что находится между числами?
"I will live to be 111 years <b>old</b> if I work out 4 days a week starting at 22."
many anyChar
не работает как разделитель, потому что он потребляет все.
Итак, как я могу получить вещи, которые соответствуют произвольному парсеру, окруженные вещами, которые я хочу игнорировать?
РЕДАКТИРОВАТЬОбратите внимание, что в реальной проблеме мой синтаксический анализатор является более сложным:
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