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