我这里有一些代码可用于将URI路径解析为字符串列表。例如,/user/home
将成为["user", "home"]
。
pathPiece :: Parser String
pathPiece = do
char '/'
path <- many1 urlBaseChar
return path
uriPath :: Parser [String]
uriPath = do
pieces <- many pathPiece
try $ char '/'
return pieces
parseUriPath :: String -> [String]
parseUriPath input = case parse uriPath "(unknown)" input of
Left _ -> []
Right xs -> xs
但是,如果路径以另一个/
结束,例如/user/home/
,它应该是合法路径,则解析器将失败。这是因为pathPiece无法解析最后的/
,因为没有后续的urlBaseChars。我想知道你如何解决它,直到它失败,如果它失败你撤消字符消耗。
答案 0 :(得分:5)
试试这个:
pathPiece :: Parser String
pathPiece = try $ do
char '/'
many1 urlBaseChar
uriPath :: Parser [String]
uriPath = do
pieces <- many pathPiece
optional (char '/')
return pieces
您需要向try
添加pathPiece
。否则,解析最终的/
将使Parsec成为可能
认为新的pathPiece
已经开始,没有try
,就没有回溯。也,
除非您确实想要要求最终/
,否则您需要将其设为optional
。该
函数try
不会这样做。
答案 1 :(得分:1)
我认为你可以在这里使用many1 urlBaseChar `sepEndBy` char '/'
。请参阅Parsec中的sepEndBy。