Regex 从字符串数组中提取数字
我有一个字符串数组Regex 从字符串数组中提取数字,regex,scala,scala-collections,Regex,Scala,Scala Collections,我有一个字符串数组 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)&它应该是可变的,这样我就可以从另一个数组中读取并附加值 我应该使用什么数据结构来实现这一点?考虑 im
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)
我们将每个数组字符串进一步标记为单词,并用一个点附加它们(例如,应该去掉尾随的点);我们尽可能将生成的令牌转换为双倍(注意Try
toOption
将为失败的转换提供None
)。使用flatMap
我们只保留成功的转换。考虑
import scala.util._
tokens.flatMap(s => Try( s.split("\\W+").mkString(".").toDouble ).toOption)
我们将每个数组字符串进一步标记为单词,并用一个点附加它们(例如,应该去掉尾随的点);我们尽可能将生成的令牌转换为双倍(注意
Try
toOption
将为失败的转换提供None
)。使用flatMap
我们只保留成功的转换。使用Regex,您可以使用此代码捕获所有数字:
\d+\.?\d+
演示:使用正则表达式,您可以使用此代码捕获所有数字:
\d+\.?\d+
演示:只需使用正则表达式过滤数组即可
val numericRegex: String = "\\d+\\.\\d+"
tokens filter(_.matches(numericRegex))
请注意,第6个值232.2.不是一个数字。您必须删除最后一个点“.”,因此它将是232.2
如果值包含空格,则必须对其进行修剪
tokens map (_.trim) filter (_.matches(numericRegex))
res28: Array[String] = Array(234.2, 8.3)
只需使用正则表达式过滤数组
val numericRegex: String = "\\d+\\.\\d+"
tokens filter(_.matches(numericRegex))
请注意,第6个值232.2.不是一个数字。您必须删除最后一个点“.”,因此它将是232.2
如果值包含空格,则必须对其进行修剪
tokens map (_.trim) filter (_.matches(numericRegex))
res28: Array[String] = Array(234.2, 8.3)
在Scala中,有一个用来组合
map
和filter
的语法糖。下面是基于的的regex方法的一个版本:
val regex = ".*\\d+\\.?\\d+.*"
val nums = for {
str <- tokens if str.matches(regex)
numStr = str.trim.split("\\W+").mkString(".")
} yield numStr.toDouble
在Scala中,有一个用来组合
map
和filter
的语法糖。下面是基于的的regex方法的一个版本:
val regex = ".*\\d+\\.?\\d+.*"
val nums = for {
str <- tokens if str.matches(regex)
numStr = str.trim.split("\\W+").mkString(".")
} yield numStr.toDouble
我刚到斯卡拉。这里的xs是什么我们是从数组中分割单个标记还是从整个句子中分割单个标记?现在使用的是
tokens
而不是xs
:)我们分割数组中的每个标记,试图只提取用点(mkString(“.”)粘在一起的“单词”(字母数字序列)然后我们试着把它们转换成双精度。只是一个查询——如果其中一个数字有逗号呢。例如,232332.33
Good point,在这种情况下可以删除逗号,例如,s.replaceAll(“,”,”).split(\\W+”).mkString(“.”)。toDouble
我是Scala的新手。这里的xs是什么我们是从数组中分割单个标记还是从整个句子中分割单个标记?现在使用的是tokens
而不是xs
:)我们分割数组中的每个标记,试图只提取用点(mkString(“.”)粘在一起的“单词”(字母数字序列)然后我们试着把它们转换成双精度。只是一个查询——如果其中一个数字有逗号呢。例如,232332.33
Good point,在这种情况下可以删除逗号,例如s.replaceAll(“,”,“).split(\\W+”).mkString(“.”)。toDouble