如何使用parsec解析字符串中所有匹配的输入并丢弃其余的输入?
示例:我有一个简单的数字解析器,如果我知道分隔数字的原因,我可以找到所有数字:
num :: Parser Int
num = read <$> 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
对于任意解析器myParser
,这很容易:
solution = many (let one = myParser <|> (anyChar >> one) in one)
这样写可能会更清楚:
solution = many loop
where
loop = myParser <|> (anyChar >> loop)
本质上,这定义了一个递归解析器(称为loop
),它将继续搜索可以解析的第一件事myParser
。many
只会彻底搜索直到失败,即:EOF。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句