コンテキストの例:
次のような本文を持つ HTTP 応答:
key1=val1&key2=val2&key3=val3.
キーの名前は常に知られています。
現在、抽出は正規表現で行われています。
val params = response split ("""&""") map { _.split("""=""") } map { el => { el(0) -> el(1) } } toMap;
特定のパラメーターの応答をパターン マッチングする簡単な方法はありますか?
コンテキストの例:
次のような本文を持つ HTTP 応答:
key1=val1&key2=val2&key3=val3.
キーの名前は常に知られています。
現在、抽出は正規表現で行われています。
val params = response split ("""&""") map { _.split("""=""") } map { el => { el(0) -> el(1) } } toMap;
特定のパラメーターの応答をパターン マッチングする簡単な方法はありますか?
splitここでは、使用がおそらく最速/最も簡単なソリューションになると思います。高度な解析を行っていないため、パーサー コンビネーターや正規表現キャプチャ グループを使用するのは少しやり過ぎに思えます。
mapただし、 、 などの複数の呼び出しを含む複雑な式がfilterある場合は、通常、for 内包表記でクリーンアップできることを示しています。
val response = "key1=val1&key2=val2&key3=val3"
val params = (for { x <- response split ("&")
Array(k, v) = x split ("=") }
yield k->v).toMap
ここでパーサー コンビネータを使用して、柔軟性と堅牢性を最大限に高めることができます (つまり、失敗した解析を処理します)。
object Parser extends RegexParsers with App {
def lit: Parser[String] = "[^=&]+".r
def pair: Parser[(String, String)] = lit ~ "=" ~ lit ^^ {
case key ~ "=" ~ value => key -> value
}
def parse: Parser[Seq[(String, String)]] = repsep(pair, "&")
val response = "key1=val1&key2=val2&key3=val3"
val params = parse(new CharSequenceReader(response)).get.toMap
println(params)
}
次のように正規表現をマッチャーとして使用できます。
val r = "([^=]+)=([^=]+)".r
def toKv(s:String) = s match {
case r(k,v) => (k,v)
case _ => throw InvalidFormatException
}
したがって、あなたの場合は次のようになります。
response split ("&") map (toKv)