Scala中带问号URL的模式匹配

Scala中带问号URL的模式匹配,scala,Scala,我试图从包含问号的URL中提取一些值 但是,下面的代码不起作用。你能帮我找出哪里出了问题吗 val LibraryPattern = ".*/library/([A-Za-z0-9\\-]+)?book=([A-Za-z0-9\\-]+)".r val url = "https://bookscollection.com/library/mylib?book=abc" Try(new URL(url)) match { case Success(url) => pr

我试图从包含问号的URL中提取一些值

但是,下面的代码不起作用。你能帮我找出哪里出了问题吗

val LibraryPattern = ".*/library/([A-Za-z0-9\\-]+)?book=([A-Za-z0-9\\-]+)".r
val url = "https://bookscollection.com/library/mylib?book=abc"
  Try(new URL(url)) match {
    case Success(url) =>
      println("my url:"+url)
      url.getPath match {
        case LibraryPattern(libId, bookId) =>

          println(libId)
          println(bookId)
        case _ =>
      }
  }
(它基本上使上一个字符/组成为可选的)。你需要逃离它

EDIT
url.getPath
仅返回
/library/mylib
,因此如果希望正则表达式匹配,则不应使用此选项

val LibraryPattern = ".*/library/([A-Za-z0-9\\-]+)\\?book=([A-Za-z0-9\\-]+)".r
val url = "https://bookscollection.com/library/mylib?book=abc"
Try(new URL(url)) match {
  case Success(url) =>
    println("my url:"+url)
    url.toString match {
      case LibraryPattern(libId, bookId) =>
        println(libId)
        println(bookId)
      case _ =>
    }
}

URL
对象已经为您解析了URL
getPath
返回
之前的所有内容,使用
getQuery
获取
之后的部分:

 val LibraryPattern = ".*/library/([A-Za-z0-9\\-]+)".r
 val BookPattern = "book=([A-Za-z0-9\\-]+)".r
 val url = "https://bookscollection.com/library/mylib?book=abc"
 Try(new URL(url)) match {
   case Success(url) =>
     url.getPath match {
       case LibraryPattern(libId) =>
         url.getQuery match {
           case BookPattern(bookId) =>
             println(libId)
             println(bookId)
         }
     }
 }

由于很少有人回答如何修复代码示例,我想建议另一种解决方案。就代码库的可读性、类型安全性和灵活性而言,使用正则表达式解析URL可能效率低下

我想建议使用或类似的东西

使用此库,您可以执行url解析,如下所示:

import io.lemonlabs.uri.Url 

val url = Url.parse("https://bookscollection.com/library/mylib?book=abc") 
val lastPathPart = url.path.parts.last 
// println(lastPathPart)
// res: String = "mylib"
val bookParam: Option[String] = url.query.param("book")
// println(bookParam)
// res: Option[String] = Some("abc")

模式不匹配,因此libId、bookId未被提取
url。getPath
返回
/library/mylib
,因此无论如何它都不会匹配。我以为你知道这件事。我会更新我的答案。我喜欢当每个人都意识到问题出在
getPath
而不是regex时,他们是如何改变自己的答案的。我想知道他们是否从未尝试只在repl中检查代码。你不能做url.getQuery并解析它吗?