针对URL的Scala模式匹配

时间:2011-09-28 16:41:30

标签: scala

是否有Scala库/示例将URL / URI解析为案例类结构以进行模式匹配?

4 个答案:

答案 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)