针对URL的Scala模式匹配

Eri*_*ser 18 scala

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

Ale*_*ise 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
}
Run Code Online (Sandbox Code Playgroud)


Phi*_*ppe 7

我建议使用提取器提供的设施来表示正则表达式.

例如:

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)
Run Code Online (Sandbox Code Playgroud)

一些解释:

  • .r字符串上的方法(实际上,在StringLikes上)将它们变成了一个实例Regex.
  • Regexes定义一个unapplySeq方法,允许它们在模式匹配中用作提取器(请注意,您必须为它们指定一个以大写字母开头的名称才能使其工作).
  • 将要传递到您在模式中使用的绑定器的值由(...)正则表达式中的组定义.

  • 俗话说 - "有些人在面对问题时,会想"我知道,我会使用正则表达式."现在他们有两个问题. (6认同)
  • 使用正则表达式解析URL很适合WORLD OF PAIN领域,但提取器是一种很好的技术...... (3认同)