是否有Scala库/示例将URL / URI解析为案例类结构以进行模式匹配?
答案 0 :(得分:31)
这是一个提取器,可以从URL中获取一些部分:
object UrlyBurd {
def unapply(in: java.net.URL) = Some((
in.getProtocol,
in.getHost,
in.getPort,
in.getPath
))
}
val u = new java.net.URL("http://www.google.com/")
u match {
case UrlyBurd(protocol, host, port, path) =>
protocol +
"://" + host +
(if (port == -1) "" else ":" + port) +
path
}
答案 1 :(得分:7)
我建议使用extractors for regular expressions提供的工具。
例如:
val URL = """(http|ftp)://(.*)\.([a-z]+)""".r
def splitURL(url : String) = url match {
case URL(protocol, domain, tld) => println((protocol, domain, tld))
}
splitURL("http://www.google.com") // prints (http,www.google,com)
一些解释:
.r
方法(实际上,在StringLike
s上)将它们转换为Regex
的实例。Regex
定义一个unapplySeq
方法,允许它们在模式匹配中用作extractors(请注意,您必须为它们指定一个以大写字母开头的名称为了这个工作)。(...)
定义。答案 2 :(得分:4)
您可以使用java's URL来解析其不同组件的网址,并且完全兼容Scala。
答案 3 :(得分:2)
以下库可以帮助您将URI解析为案例类的实例。 (免责声明:这是我自己的图书馆) https://github.com/theon/scala-uri
你这样解析:
import com.github.theon.uri.Uri._
val uri:Uri = "http://example.com?one=1&two=2"
它提供了一个用于使用查询字符串构建URL的DSL:
val uri = "http://example.com" ? ("one" -> 1) & ("two" -> 2)