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
.r
en cadenas (en realidad, enStringLike
s) las convierte en una instancia deRegex
. -
Regex
es 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.