2

コンテキストの例:

次のような本文を持つ HTTP 応答:

key1=val1&key2=val2&key3=val3.

キーの名前は常に知られています。

現在、抽出は正規表現で行われています。

  val params = response split ("""&""") map { _.split("""=""") } map { el => { el(0) -> el(1) } } toMap;

特定のパラメーターの応答をパターン マッチングする簡単な方法はありますか?

4

3 に答える 3

5

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
于 2013-09-16T15:51:07.723 に答える
4

ここでパーサー コンビネータを使用して、柔軟性と堅牢性を最大限に高めることができます (つまり、失敗した解析を処理します)。

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)
}
于 2013-09-16T12:34:45.100 に答える
3

次のように正規表現をマッチャーとして使用できます。

val r = "([^=]+)=([^=]+)".r

 def toKv(s:String) = s match { 
    case r(k,v) => (k,v)
    case _ => throw InvalidFormatException
}

したがって、あなたの場合は次のようになります。

response split ("&") map (toKv) 
于 2013-09-16T11:23:44.410 に答える