从scala中的长字符串中提取字符串

时间:2013-10-31 01:05:15

标签: regex scala

我想从字符串对象中提取有用的字段,如下所示

Request(Some(8454439),Some(16872692),Some(0.0.0.0),Some(8281008),Some(ArrayBuffer(845434399)),Some(129032),Some(3),Some(Profile),Some(en),None,None,None,None,Some(true),None,Some(Food),None,Some(Fish))

它总共有18个字段,我想要做的是将它们分配给18个不同的字符串并提取有用的信息(如果它是Some(X),否则将字符串设置为None

例如,在这种情况下,响应中的字符串数组应为

val results = Array("8454439", "16872692", "0.0.0.0", "8281008", "ArrayBuffer(845434399)",
"129032", "3", "Profile", "en", "None", "None", "None", "None", "true", "None",
"Food", "None", "Fish")

2 个答案:

答案 0 :(得分:1)

如果你能以某种方式得到项目清单,你可以用Seq[Option[Any]]做这样的事情:

val items: Seq[Option[Any]] = ???
items.map(_.getOrElse("None").toString)

但是如果你只有Request.toString的输出,这将会让你大部分时间:

val s = "Request(Some(8454439),Some(16872692),Some(0.0.0.0),Some(8281008),Some(ArrayBuffer(845434399)),Some(129032),Some(3),Some(Profile),Some(en),None,None,None,None,Some(true),None,Some(Food),None,Some(Fish))"
val pat1 = """Some\([\w.()]+?\)|None""".r
val pat2 = """Some\((.*)\)""".r
pat1.findAllIn(s).map {
  case pat2(some) => some
  case x => x
}.toList
// res0: List[String] = List(8454439, 16872692, 0.0.0.0, 8281008, ArrayBuffer(845434399, 129032, 3, Profile, en, None, None, None, None, true, None, Food, None, Fish)

我的正则表达式不足以将尾随括号保留在ArrayBuffer值上,但除此之外似乎有用。

答案 1 :(得分:0)

您是否尝试过

的内容
val items = request.map {
    case Some(value) => value
    case None => "None"
}

要实际将Some(ArrayBuffer(845434399))转换为“ArrayBuffer(845434399)”,您可能需要嵌套匹配语句:

val items = request.map {
    case Some(value) => value match {
                            case strng: String => strng
                            case other => ???
                        }
    case None => "None"
}

离开我的头顶,不知道该怎么做才能做到,但也许任何一种类型的功能都会有所帮助。