我这里有一些代码可用于将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不这样做。

10-04 16:54