Scala正则表达式和部分函数

时间:2015-01-20 17:02:51

标签: regex function scala partialfunction

我想将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语句中匹配,然后我检查它是否再次匹配以提取匹配组。有没有办法只用一次检查正则表达式匹配就可以做到这一点?

2 个答案:

答案 0 :(得分:4)

您不需要第一场比赛:

<other_code>.collect {
    case regex(feature, hash, value, weight) => (feature.split("\\^"), weight.toDouble)
}

答案 1 :(得分:1)

检查正则表达式是否匹配是不必要的,因为模式匹配将为您完成。让我用一个稍微简单的例子来说明。

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 { ... }可能会导致匹配错误。