我是Haskell和Parsec的新手。
我想解析字符串's:numb:“string”;'的php-serialize格式。喜欢

s:12:“123”; 6789012“;

数字是字符数。
因此,函数如下所示:

newtype PhpString = PhpString String

pString :: GenParser Char st PhpString
pString = do { string "s:"
        ; value1 <- many1 digit
        ; string ":\""
        ; value2 <- takeExactNChars (read value1)
        ; string "\";"
        ; return $ PhpString value2
    }
    where
        takeExactNChars n = ???????

最佳答案

我会使用Control.Monad的replicateM编写它:

import Text.ParserCombinators.Parsec
import Control.Monad (replicateM)

pString :: Parser String
pString = do string "s:"
             n <- fmap read (many1 digit)
             string ":\""         -- Bug fix; you weren't picking up the colon
             s <- replicateM n anyChar
             string "\";"
             return s

在ghci中对其进行测试:
*Main> parse pString "" "s:12:\"123\";6789012\";"
Right "123\";6789012"

关于haskell - 如何使用Parsec读取确切的N个字符?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15474016/

10-09 15:53