在 Scala 中解析 Url 个参数
Parsing Url Parameters in Scala
为了在 Scala 中从编码的 URL 中解析出合理的参数,我一直在努力获得一个简洁的实用函数。尽管阅读了很多书并尝试使用库工具,但我没有任何特别有用的东西。
这是我目前的解决方案,使用了几个匹配集。我会对人们对此的一些反馈或其他解决方案感兴趣。
def EncodedUrlToParamMap(encodedURL:String): Map[String,String] = {
def toMap(l:List[String], acc: Map[String,String]): Map[String,String] = {
if (l.length<2) acc
else if (l.length==2) toMap( List.empty, acc + (l.head -> URLDecoder.decode(l.tail.head,"UTF-8")))
else toMap( l.drop(2), acc+(l.head->l(2)))
}
val paramPattern: Regex = "\?([\s\S]*)$".r
val valuePattern: Regex = "[^?=&]*".r
paramPattern.findFirstIn( encodedURL ) match {
case Some(params) =>
val values: List[String] = valuePattern.findAllIn( params ).toList.filter(_.nonEmpty)
toMap(values, Map.empty)
case None =>
Map.empty
}
}
- paramPattern 转换 "https//www.domain.com/page?key1=value1&key2=value2" --> "?key1=value1&key2=value2"
- valuePattern 分隔每个键和值
如果您只想提取 key/value,您可以通过更简单的方式进行提取,但首先,只需将您的字符串键入 URI
def EncodedUrlToParamMap2(encodedURL: URI): Map[String,String] = {
val map = encodedURL
.getRawQuery //Method from URI - you get the query string directly (after the ?)
.split("&") //Split on "&"
.collect {
case s"$key=$value" => key -> value //Since scala 2.13, you can do pattern matching with extraction
// The -> creates a tuple of 2 elements
// You can add URLDecoder on v here
}
.toMap // Get the whole as a Map
map
}
val uri = new URI("https//www.domain.com/page?key1=value1&key2=value2")
EncodedUrlToParamMap2(uri)
为了在 Scala 中从编码的 URL 中解析出合理的参数,我一直在努力获得一个简洁的实用函数。尽管阅读了很多书并尝试使用库工具,但我没有任何特别有用的东西。
这是我目前的解决方案,使用了几个匹配集。我会对人们对此的一些反馈或其他解决方案感兴趣。
def EncodedUrlToParamMap(encodedURL:String): Map[String,String] = {
def toMap(l:List[String], acc: Map[String,String]): Map[String,String] = {
if (l.length<2) acc
else if (l.length==2) toMap( List.empty, acc + (l.head -> URLDecoder.decode(l.tail.head,"UTF-8")))
else toMap( l.drop(2), acc+(l.head->l(2)))
}
val paramPattern: Regex = "\?([\s\S]*)$".r
val valuePattern: Regex = "[^?=&]*".r
paramPattern.findFirstIn( encodedURL ) match {
case Some(params) =>
val values: List[String] = valuePattern.findAllIn( params ).toList.filter(_.nonEmpty)
toMap(values, Map.empty)
case None =>
Map.empty
}
}
- paramPattern 转换 "https//www.domain.com/page?key1=value1&key2=value2" --> "?key1=value1&key2=value2"
- valuePattern 分隔每个键和值
如果您只想提取 key/value,您可以通过更简单的方式进行提取,但首先,只需将您的字符串键入 URI
def EncodedUrlToParamMap2(encodedURL: URI): Map[String,String] = {
val map = encodedURL
.getRawQuery //Method from URI - you get the query string directly (after the ?)
.split("&") //Split on "&"
.collect {
case s"$key=$value" => key -> value //Since scala 2.13, you can do pattern matching with extraction
// The -> creates a tuple of 2 elements
// You can add URLDecoder on v here
}
.toMap // Get the whole as a Map
map
}
val uri = new URI("https//www.domain.com/page?key1=value1&key2=value2")
EncodedUrlToParamMap2(uri)