我这里有一些代码可用于将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。我想知道如何解析很多,直到失败为止;如果失败,您将撤消字符消耗。 最佳答案
试试这个:
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
不这样做。