这个简单的解析器预计会解析以下形式的消息
key: value\r\nkey: value\r\n\r\nkey: value\r\nkey: value\r\n\r\n
一个 EOL 作为字段分隔符,两个 EOL 作为消息分隔符。当 EOL 分隔符为 \n
时它工作得很好,但当 \r\n
时 parseWith
总是返回失败。
parsePair = do
key <- B8.takeTill (==':')
_ <- B8.char ':'
_ <- B8.char ' '
value <- B8.manyTill B8.anyChar endOfLine
return (key, value)
parseListPairs = sepBy parsePair endOfLine <* endOfLine
parseMsg = sepBy parseListPairs endOfLine <* endOfLine
最佳答案
我假设您正在使用这些导入:
{-# LANGUAGE OverloadedStrings #-}
import qualified Data.Attoparsec.ByteString.Char8 as B8
import Data.Attoparsec.ByteString.Char8
问题是 endOfLine
消耗了行尾,所以也许你真的想要这样的东西:
parseListPairs = B8.many1 parsePair <* endOfInput
例如,这有效:
ghci> parseOnly parseListPairs "k: v\r\nk2: v2\r\n"
Right [("k","v"),("k2","v2")]
更新:
要解析多条消息,您可以使用:
parseListPairs = B8.manyTill parsePair endOfLine
parseMsgs = B8.manyTill parseListPairs endOfInput
ghci> test3 = parseOnly parseMsgs "k1: v1\r\nk2: v2\r\n\r\nk3: v3\r\nk4: v4\r\n\r\n"
Right [[("k1","v1"),("k2","v2")],[("k3","v3"),("k4","v4")]]
关于haskell - 为什么当行尾序列是 CRLF 时这个解析器总是失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32368392/