2

我正在尝试使用由多个字符组成的定界符来分隔字符串,但问题是这些字符中的每一个都可以在非定界字符串中单独出现。例如,我有foo*X*bar*X*baz, 分隔符在哪里*X*,所以我想得到[foo, bar, baz],但每个都可以包含*or X

我努力了

sepBy (many anyChar) delimiter

但这只会吞噬整个字符串,"foo*X*bar*X*baz"如果我这样做的话

sepBy anyChar (optional delimiter)

它会正确过滤掉分隔符,但不会对列表进行分区,返回"foobarbaz". 我不知道我可以尝试哪种其他组合。

4

1 回答 1

3

也许你想要这样的东西,

tok = (:) <$> anyToken <*> manyTill anyChar (try (() <$ string sep) <|> eof)

anyToken可以防止我们在输入结束时永远循环,try让我们避免过度使用分隔符。

完整的测试代码,

module ParsecTest where
import Control.Applicative ((<$), (<$>), (<*>))
import Data.List (intercalate)
import Text.Parsec
import Text.Parsec.String

sep,msg :: String
sep = "*X*"
msg = intercalate "*X*" ["foXo", "ba*Xr", "bX*az"]

tok :: Parser String
tok = (:) <$> anyToken <*> manyTill anyChar (try (() <$ string sep) <|> eof)

toks :: Parser [String]
toks = many tok

test :: Either ParseError [String]
test = runP toks () "" msg
于 2013-09-23T22:08:24.137 回答