software - Coincidencia de patrones Scala contra URLs
scala vs java (4)
Aquí hay un extractor que obtendrá algunas partes de una URL para ti:
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
}
¿Existe una biblioteca / ejemplo de Scala que analice una URL / URI en una estructura de clase de caso para la comparación de patrones?
La siguiente biblioteca puede ayudarlo a analizar los URI en una instancia de una clase de caso. (Descargo de responsabilidad: es mi propia biblioteca) https://github.com/theon/scala-uri
Se analiza así:
import com.github.theon.uri.Uri._
val uri:Uri = "http://example.com?one=1&two=2"
Proporciona un DSL para crear URL con cadenas de consulta:
val uri = "http://example.com" ? ("one" -> 1) & ("two" -> 2)
Puede usar la URL de java que puede analizar una URL para sus diferentes componentes y es completamente compatible con Scala.
Yo sugeriría usar la facilidad provista por los extractores para expresiones regulares .
Por ejemplo:
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)
Algunas explicaciones:
- El método
.ren cadenas (en realidad, enStringLikes) las convierte en una instancia deRegex. -
Regexes define un métodounapplySeq, que permite que se utilicen como extractors en la coincidencia de patrones (tenga en cuenta que debe darles un nombre que comience con una letra mayúscula para que esto funcione). - Los valores que se pasarán a las carpetas que usa en el patrón están definidos por los grupos
(...)en la expresión regular.