从字符串数组中提取数字

Extract numbers from String Array

我有一个字符串数组

scala> tokens
res34: Array[String] = Array(The, value, of, your, profile, is, 234.2., You, have, potential, to, gain, 8.3, more.)

这里每个逗号分隔的值都是一个字符串。
我想从中提取数字,即我的输出应该是 result = (234.2, 8.3) & 它应该是可变的,这样我就可以从另一个数组中读取并附加值

我应该使用什么数据结构来实现这个?

考虑

import scala.util._
tokens.flatMap(s => Try( s.split("\W+").mkString(".").toDouble ).toOption)

我们将每个数组字符串进一步标记为 words 并用一个点附加它们(这应该去除例如尾随点);我们尽可能将生成的标记转换为双精度(注意 Try toOption 将为失败的转换提供 None )。 flatMap 我们只保留成功的转换。

使用正则表达式,您可以使用此代码来捕获所有数字:

\d+\.?\d+

演示:https://regex101.com/r/pZomjn/1

使用正则表达式简单地过滤你的数组

val numericRegex: String = "\d+\.\d+"
tokens filter(_.matches(numericRegex))

请注意,第 6 个值 232.2. 不是数字。您必须删除最后一个点“。”所以它将是 232.2

如果值包含空格,则您必须 trim 它们

tokens map (_.trim) filter (_.matches(numericRegex))
res28: Array[String] = Array(234.2, 8.3)

在 Scala 中,有一个语法糖来组合 mapfilter,称为 for comprehension。以下是基于 for:

的正则表达式方法的一个版本
val regex = ".*\d+\.?\d+.*"
val nums = for {
    str <- tokens if str.matches(regex)
    numStr = str.trim.split("\W+").mkString(".")
} yield numStr.toDouble

它给出了所需的输出:

nums: Array[Double] = Array(234.2, 8.3)