Scala 正则表达式和部分函数
Scala regex and partial functions
我想将 Scala 的 collect 函数与正则表达式一起使用。理想情况下,我只想收集那些与正则表达式匹配的术语。到目前为止,我已经实施了以下工作正常
val regex = "(^([^:]+):([^:]+):([^:]+):([+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)$".r
<other_code>.collect{case x: String if regex.pattern.matcher(x).matches =>
x match {
case regex(feature, hash, value, weight) => (feature.split("\^"), weight.toDouble)
}
}
虽然这似乎有一个额外的步骤。我首先检查正则表达式是否匹配 case 语句中的 collect,然后我再次检查它是否匹配以提取匹配组。有没有一种方法可以让我只检查一次正则表达式匹配来做到这一点?
您不需要第一个匹配项:
<other_code>.collect {
case regex(feature, hash, value, weight) => (feature.split("\^"), weight.toDouble)
}
不需要检查正则表达式是否匹配,因为模式匹配会为您完成。让我用一个稍微简单一点的例子来说明。
val regex = "(\d+),([A-z]+)".r
val input = List("1,a", "23,zZ", "1", "1ab", "")
scala> input collect { case regex(a, b) => (a, b) }
res2: List[(String, String)] = List((1,a), (23,zZ))
使用x match { ... }
可能会导致匹配错误。
我想将 Scala 的 collect 函数与正则表达式一起使用。理想情况下,我只想收集那些与正则表达式匹配的术语。到目前为止,我已经实施了以下工作正常
val regex = "(^([^:]+):([^:]+):([^:]+):([+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)$".r
<other_code>.collect{case x: String if regex.pattern.matcher(x).matches =>
x match {
case regex(feature, hash, value, weight) => (feature.split("\^"), weight.toDouble)
}
}
虽然这似乎有一个额外的步骤。我首先检查正则表达式是否匹配 case 语句中的 collect,然后我再次检查它是否匹配以提取匹配组。有没有一种方法可以让我只检查一次正则表达式匹配来做到这一点?
您不需要第一个匹配项:
<other_code>.collect {
case regex(feature, hash, value, weight) => (feature.split("\^"), weight.toDouble)
}
不需要检查正则表达式是否匹配,因为模式匹配会为您完成。让我用一个稍微简单一点的例子来说明。
val regex = "(\d+),([A-z]+)".r
val input = List("1,a", "23,zZ", "1", "1ab", "")
scala> input collect { case regex(a, b) => (a, b) }
res2: List[(String, String)] = List((1,a), (23,zZ))
使用x match { ... }
可能会导致匹配错误。