[英]What's wrong with Scala Regex in case match?
我在下面定義了兩個正則表達式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)
?
您在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"
}
})
另一種解決方案是將捕獲組更改為非捕獲組:
val doubleRegex = """^[-+]?[0-9]*[.]?[0-9]+(?:[eE][-+]?[0-9]+)?$""".r
^^
然后,您可以使用case intRegex() => "INT"
和case doubleRegex() => "DOUBLE"
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.