【问题标题】:Scala pattern matching against URLs针对 URL 的 Scala 模式匹配
【发布时间】:2011-11-27 01:08:13
【问题描述】:

是否有 Scala 库/示例可以将 URL/URI 解析为案例类结构以进行模式匹配?

【问题讨论】:

    标签: scala


    【解决方案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】:

    我建议使用extractors for regular expressions提供的设施。

    例如:

    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 方法(实际上是在@987654322@s 上)将它们变成@987654323@ 的一个实例。
    • Regexes 定义了一个 unapplySeq 方法,它允许它们在模式匹配中用作 extractors(请注意,您必须给它们一个以大写字母开头的名称才能工作)。
    • 将传递到您在模式中使用的活页夹中的值由正则表达式中的组 (...) 定义。

    【讨论】:

    • 如果我理解正确,正则表达式返回 Seq[String]?如果我需要对查询字符串参数进行更复杂的匹配,我可能也会解析这些参数并执行以下操作:case class Url(protocol: String, domain: String, tld: String, uri: String, Tuple2[String, String ] queryStringParameters))
    • @Eric 上面的方法将返回=> 之后的任何内容。按照定义,它返回Unit,但您可以将元组的println... 更改为(protocol, domain, tld),如果您想要一个Seq,则可以将Seq(protocol, domain, tld) 更改为您的案例类,如果您定义了一个,则可以更改您的案例类。
    • 使用正则表达式解析 URL 已经进入了痛苦的世界,但提取器是一种很好的技术......
    • 俗话说-Some people, when confronted with a problem, think “I know, I'll use regular expressions.” Now they have two problems.
    • 要点 :) 我会争辩说 URL 就在不可正则表达式的最终边界之前。
    【解决方案3】:

    您可以使用java's URL,它可以解析不同组件的 URL,并且完全兼容 Scala。

    【讨论】:

      【解决方案4】:

      以下库可以帮助您将 URI 解析为案例类的实例。 (免责声明:这是我自己的图书馆) 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)
      

      【讨论】:

      • 有没有办法在不捕获异常的情况下检查 URL 是否有效?例如。当我尝试做val uri: Uri = "$%&" 时,我得到一个奇怪的StringIndexOutOfBoundsException
      猜你喜欢
      • 2013-09-06
      • 1970-01-01
      • 2014-09-26
      • 2019-12-30
      • 2019-02-13
      • 2016-05-17
      • 2021-12-17
      • 1970-01-01
      • 2012-10-31
      相关资源
      最近更新 更多