我正在为日志文件编写解析器。日志文件中的一行列出了HTTP请求的参数:
Parameters: {"back"=>"true", "embed_key"=>"12affbbace", "action"=>"index", "ajax"=>"1", "controller"=>"heyzap", "embed"=>"1"}
我在使用Attoparsec解析此问题时遇到了问题。我的基本想法是解析并放弃Parameters: {
,然后将文字保持为}
。然后我将该文本解析为(key, value)
元组列表。这是我到目前为止所得到的:
parseParams :: Parser [(Text, Text)]
parseParams = do
paramString <- " Parameters: {" *> takeTill' (== '}')
let params = splitOn ", " paramString
-- I'm not sure how to apply parseParamPair to params here
parseParamPair :: Parser (Text, Text)
parseParamPair = do
key <- parseKeyOrValue
value <- string "=>" >> parseKeyOrValue
return (key, value)
where
parseKeyOrValue :: Parser Text
parseKeyOrValue = char '"' >> takeTill' (== '"')
takeTill' :: (Char -> Bool) -> Parser Text
takeTill' func = takeTill func <* skip func
我该如何实现?我应该以某种方式使用Data.Attoparsec.Text.sepBy
吗?