模式匹配字符串拆分$

时间:2015-09-02 09:53:44

标签: scala

Hello目前我有以下字符串:

"STRING$INTEGER$STRING$STRING"

我如何在scala中匹配模式? 目前我知道我可以使用.split,但是产生Array[String]我的正则表达式是有缺陷的我可以匹配(。*)的所有内容但是它会将第二个作为String处理但是它是一个int,有没有办法

data match {}

3 个答案:

答案 0 :(得分:2)

您可以使用正则表达式,但您匹配的所有内容都是String

val format = """(\w+)\$(\d+)\$(\w+)\$(\w+)""".r

"hello$5$foo$bar" match {
  case format(s1, i, s2, s3) => // i is a String
    val n = i.toInt
}

您还可以创建一个可以使用上面的正则表达式或split的提取器。

object Format {
  def unapply(string: String) = string.split("""\$""") match {
    case Array(s1, i, s2, s3) => 
      Try(i.toInt).toOption.map(i => (s1, i, s2, s3))
  }
}

"hello$5$foo$bar" match {
  case Format(s1, i, s2, s3) => i + 5  // i is an Int
}
// Int = 10

答案 1 :(得分:0)

你的问题很不清楚,但我想你可能需要这样的东西?

val string = "STRING$INTEGER$STRING$STRING"
val regex = """(\w+)\$(\w+)\$(\w+)\$(\w+)""".r

string match {
  case regex(s1, i, s2, s3) =>
    s"$s1, $i, $s2, $s3"
  case _ =>
    "error"
}

|> res0: String = STRING, INTEGER, STRING, STRING

答案 2 :(得分:0)

要将字符val s = "abc$123$foo$bar"$分开,请考虑

val xs = s.split("\\$")
xs: Array[String] = Array(abc, 123, foo, bar)

要收集结果数组中的所有整数值,请考虑例如

xs.flatMap( s => scala.util.Try(s.toInt).toOption )
res: Array[Int] = Array(123)

我们尝试将每个字符串转换为整数值;如果失败,它会传递None,这会被夷为平地。