Scala中带问号URL的模式匹配
我试图从包含问号的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
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
对象已经为您解析了URLgetPath
返回?
之前的所有内容,使用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并解析它吗?