tutorial software examples blanquerna bayer scala

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, en StringLike s) las convierte en una instancia de Regex .
  • Regex es define un método unapplySeq , 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.