キーと値のペアの文字列を簡単に解析してscalaケースクラスにする方法はありますか?
たとえば、次の文字列から:
"consumer_key=1234ABC, consumer_secret=12345ABC"
の中へ
case class Auth(consumerKey: String, consumerSecret: String)
キーと値のペアの文字列を簡単に解析してscalaケースクラスにする方法はありますか?
たとえば、次の文字列から:
"consumer_key=1234ABC, consumer_secret=12345ABC"
の中へ
case class Auth(consumerKey: String, consumerSecret: String)
正規表現とパターン マッチングを使用できます。
scala> val R = "consumer_key=(.*), consumer_secret=(.*)".r
R: scala.util.matching.Regex = consumer_key=(.*), consumer_secret=(.*)
scala> "consumer_key=1234ABC, consumer_secret=12345ABC" match {
| case R(k, v) => Auth(k, v)
| }
res0: Auth = Auth(1234ABC,12345ABC)
JavaTokenParsers
より柔軟な解析に使用します。
import scala.util.parsing.combinator._
case class Auth( consumerKey: String, consumerSecret: Option[String])
class AuthParser extends JavaTokenParsers {
def auth: Parser[Auth] = key ~ opt("," ~> secret) ^^ { case k ~ s => Auth(k, s)}
def key: Parser[String] = value("consumer_key")
def secret: Parser[String] = value("consumer_secret")
def value(k: String): Parser[String] = k ~ "=" ~> "[^,]*".r
def apply(s: String) = parseAll(auth, s)
}
使用法:
scala> val p = new AuthParser
p: AuthParser = AuthParser@433b9799
scala> p("consumer_key=1234ABC, consumer_secret=12345ABC").get
res0: Auth = Auth(1234ABC,Some(12345ABC))
scala> p("consumer_key=1234ABC").get
res1: Auth = Auth(1234ABC,None)
私は scala Parsers ライブラリが大好きですが、少し遅いです。文字列がすべてそのように見える場合は、次のように簡単に実行できます。
case class Auth( consumerKey:String, consumerSecret:String)
object Auth {
def fromString(string: String): Seq[Auth] = string.split(", ").toSeq map { pair =>
val lst = pair.split("=")
Auth(lst(0), lst(1))
}
}
を開始して、期待しているパターンが十分に単純であれば、文字列インターポレーターScala 2.13
を適用しないことでパターン マッチできる可能性があります。
// case class Auth(consumerKey: String, consumerSecret: String)
"consumer_key=1234ABC, consumer_secret=12345ABC" match {
case s"consumer_key=$key, consumer_secret=$secret" => Auth(key, secret)
}
// Auth("1234ABC", "12345ABC")