Сравнение шаблонов Scala с URL - PullRequest
18 голосов
/ 28 сентября 2011

Существует ли библиотека / пример Scala, которая будет анализировать URL / URI в структуру класса дел для сопоставления с образцом?

Ответы [ 4 ]

31 голосов
/ 28 сентября 2011

Вот экстрактор, который извлечет некоторые части из 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
}
7 голосов
/ 28 сентября 2011

Я бы предложил использовать средство, предоставляемое экстракторами для регулярных выражений .

Например:

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 для строк (фактически, <a href="http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.StringLike" rel="noreferrer">StringLike</a> s) превращает их в экземпляр <a href="http://www.scala-lang.org/api/current/scala/util/matching/Regex.html" rel="noreferrer">Regex</a>.
  • Regex es определяет метод unapplySeq, который позволяет имиспользоваться в качестве экстракторов при сопоставлении с образцом (обратите внимание, что для этого нужно дать им имя, которое начинается с заглавной буквы).
  • Значения, которые будут переданыв связующие, которые вы используете в шаблоне, определяются группами (...) в регулярном выражении.
4 голосов
/ 28 сентября 2011

Вы можете использовать URL Java , который может анализировать URL для его различных компонентов и полностью совместим с Scala.

2 голосов
/ 20 ноября 2012

Следующая библиотека может помочь вам разобрать URI в экземпляр класса case.(Отказ от ответственности: это моя собственная библиотека) 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...