Scala Regex在案例匹配中有什么问题?

时间:2015-10-21 20:03:32

标签: regex scala

我在下面定义了两个正则表达式doubleRegexintRegex

scala> val doubleRegex = """^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$""".r
doubleRegex: scala.util.matching.Regex = ^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$

scala> val intRegex = """^[-+]?[0-9]*$""".r
intRegex: scala.util.matching.Regex = ^[-+]?[0-9]*$

现在我想匹配一堆字符串来检测它们的类型:

scala> List(".01", "11", "1.34").map{ s => 
       s match {
          case intRegex() => "INT"
          case doubleRegex() => "DOUBLE"
          case _ => "NONE"
       }
     }
res5: List[String] = List(NONE, INT, NONE)

为什么不打印List(DOUBLE, INT, DOUBLE)

1 个答案:

答案 0 :(得分:2)

您在doubleRegex中指定了一个捕获组,并且在执行时,您将获取捕获组(并且第一个捕获组在示例中为空)。

使用doubleRegex(_*)检查字符串是否匹配而不提取捕获组:

val doubleRegex = """^[-+]?[0-9]*[.]?[0-9]+([eE][-+]?[0-9]+)?$""".r
val intRegex = """^[-+]?[0-9]*$""".r
print(List(".01", "11", "1.34").map{ s => 
   s match {
      case intRegex(_*) => "INT"
      case doubleRegex(_*) => "DOUBLE"
      case _ => "NONE"
   }
})

请参阅IDEONE demo

另一个解决方案是将捕获组更改为非捕获组:

val doubleRegex = """^[-+]?[0-9]*[.]?[0-9]+(?:[eE][-+]?[0-9]+)?$""".r
                                            ^^

然后,您可以使用case intRegex() => "INT"case doubleRegex() => "DOUBLE"

请参阅another IDEONE demo