2012-10-25 27 views
5

पर आसानी से कुंजी = वैल्यू जोड़े के स्ट्रिंग को स्ट्रिंग करें, क्या स्केल केस क्लास में कुंजी मान जोड़े की स्ट्रिंग को आसानी से पार्स करने का कोई तरीका है?स्केल केस क्लास

निम्न स्ट्रिंग

"consumer_key=1234ABC, consumer_secret=12345ABC" 

से उदाहरण के लिए

case class Auth(consumerKey:String, consumerSecret:String) 

या यहाँ तक कि

case class Auth(consumer_key:String, consumer_secret:String) 
+0

क्या आपके सभी तारों में यह संरचना है? यदि हां, तो आप इसे स्पष्ट रूप से क्यों नहीं तोड़ते? 'वैल (कुंजी, गुप्त) = (s.slice (" consumer_key = "लंबाई, s.indexOf (", ")), s.drop (s.lastIndexOf (" = ")))' –

+0

नहीं, मैंने अभी पोस्ट किया है पहले दो लेकिन वहां और भी हैं। –

उत्तर

9

आप उपयोग कर सकते हैं regex और पैटर्न मिलान में:

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 = [email protected] 

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) 
+0

धन्यवाद कि मैं जो खोज रहा था, क्या उनमें से एक को वैकल्पिक बनाने के लिए वैसे भी है? –

+0

@ एंथनीएमसीकॉमिक: वैकल्पिक 'उपभोक्ता_सेक्रेट' के लिए उत्तर अपडेट किया गया। – senia

2

मैं स्केला 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)) 
    } 
} 
0

मैं nnythm से सहमत हूं लेकिन यह समाधान समस्या का समाधान नहीं करता है। यह बेहतर काम कर सकते हैं:

case class Auth(consumerKey:String, consumerSecret:String) 
object Auth { 
    def fromString(s: String): Auth = { 
    val p = s.split(", ").toSeq.map { pair => { 
     val lst = pair.split("=") 
     (lst(0), lst(1)) 
    }}.toMap 
    Auth(p("consumer_key"), p("consumer_secret")) 
    } 
} 

यह कुंजी मान युग्म के किसी भी संख्या के साथ एक स्ट्रिंग है करने में सक्षम होने के अतिरिक्त लाभ है और आप आसानी से जो आप के साथ काम करने के लिए चुन बदल सकते हैं।