我在下面定义了两个正则表达式doubleRegex
和intRegex
:
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)
?
答案 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"
。