Hello目前我有以下字符串:
"STRING$INTEGER$STRING$STRING"
我如何在scala中匹配模式?
目前我知道我可以使用.split,但是产生Array[String]
我的正则表达式是有缺陷的我可以匹配(。*)的所有内容但是它会将第二个作为String处理但是它是一个int,有没有办法
data match {}
答案 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
,这会被夷为平地。