代码之家  ›  专栏  ›  技术社区  ›  Paresh Nagore

从字符串数组中提取数字

  •  1
  • Paresh Nagore  · 技术社区  · 8 年前

    我有一个字符串数组

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

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

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

    4 回复  |  直到 8 年前
        1
  •  4
  •   elm    8 年前

    考虑

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

    在这里,我们将每个数组字符串进一步标记为 并将它们附加一个点(这应该去掉例如尾随点);我们尽可能将生成的标记转换为双精度(注意: Try toOption 将交付 None 对于失败的转换)。具有 flatMap 我们只保留成功的转换。

        2
  •  3
  •   igx    8 年前

    只需使用正则表达式过滤数组

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

    注意,第6个值 不是一个数字。您必须删除最后一个点“.”,因此 232.2

    如果值包含空格,则必须修剪它们

    tokens map (_.trim) filter (_.matches(numericRegex))
    res28: Array[String] = Array(234.2, 8.3)
    
        3
  •  1
  •   Ibrahim    8 年前

    使用Regex,您可以使用以下代码捕获所有数字:

    \d+\.?\d+
    

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

        4
  •  1
  •   dkolmakov    8 年前

    在Scala中,有一个语法糖可以组成 map filter 打电话 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)