Существует ли библиотека /w Scala библиотека, которая будет анализировать URL/URI в структуре класса case для соответствия шаблону?
Scala сопоставление шаблонов с URL-адресами
Ответ 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)