我正在使用Attoparsec,据说默认情况下会回溯。但是,以下行:
parseOnly (string "foo" *> many1 anyChar <* string "bar") "fooxxxbar"
失败了:
Left "not enough input"
为什么会这样?如果many1 anyChar
决定只解析三个字符(xxx
),那么它应该会成功。它应该考虑在某些时候因为回溯而这样做,不应该吗?
使用Attoparsec进行等效/foo(.*)bar/
正则表达式的正确方法是什么?
答案 0 :(得分:2)
我正在使用Attoparsec,据说默认情况下会回溯。
不完全。 Attoparsec 支持支持回溯,但仅限于某些明确的情况(文档说明的情况)。它的目的是进行高性能的解析,并且不出所料,它在回溯方面表现不佳。
您正在寻找manyTill
或manyTill'
。请注意,文档中提到了回溯行为。
ghci> manyTill1 p e = (:) <$> p <*> manyTill p e
ghci> parseOnly (string "foo" *> manyTill1 anyChar (string "bar")) "fooxxxbar"
Right "xxx"