Подтвердить что ты не робот

Scala сопоставление шаблонов с URL-адресами

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

4b9b3361

Ответ 1

Вот экстрактор, который получит некоторые части из 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
}

Ответ 2

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

Например:

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 es определяют метод unapplySeq, который позволяет использовать их как экстракторы в сопоставлении с образцом (обратите внимание, что у вас есть чтобы дать им имя, которое начинается с заглавной буквы, чтобы это работало).
  • Значения, которые будут переданы в связующие, которые вы используете в шаблоне, определяются группами (...) в регулярном выражении.

Ответ 3

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

Ответ 4

Следующая библиотека может помочь вам разобрать 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)