【发布时间】:2011-11-27 01:08:13
【问题描述】:
是否有 Scala 库/示例可以将 URL/URI 解析为案例类结构以进行模式匹配?
【问题讨论】:
标签: scala
是否有 Scala 库/示例可以将 URL/URI 解析为案例类结构以进行模式匹配?
【问题讨论】:
标签: scala
这是一个提取器,可以为您从 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
}
【讨论】:
我建议使用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 方法(实际上是在@987654322@s 上)将它们变成@987654323@ 的一个实例。Regexes 定义了一个 unapplySeq 方法,它允许它们在模式匹配中用作 extractors(请注意,您必须给它们一个以大写字母开头的名称才能工作)。(...) 定义。【讨论】:
=> 之后的任何内容。按照定义,它返回Unit,但您可以将元组的println... 更改为(protocol, domain, tld),如果您想要一个Seq,则可以将Seq(protocol, domain, tld) 更改为您的案例类,如果您定义了一个,则可以更改您的案例类。
Some people, when confronted with a problem, think “I know, I'll use regular expressions.” Now they have two problems.
您可以使用java's URL,它可以解析不同组件的 URL,并且完全兼容 Scala。
【讨论】:
以下库可以帮助您将 URI 解析为案例类的实例。 (免责声明:这是我自己的图书馆) https://github.com/theon/scala-uri
你这样解析:
import com.github.theon.uri.Uri._
val uri:Uri = "http://example.com?one=1&two=2"
它提供了一个 DSL 用于构建带有查询字符串的 URL:
val uri = "http://example.com" ? ("one" -> 1) & ("two" -> 2)
【讨论】:
val uri: Uri = "$%&" 时,我得到一个奇怪的StringIndexOutOfBoundsException