2015-10-21 27 views
1

我有兩個正則表達式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)

+0

使用'情況intRegex(_ *)=> 「INT」'和'情況doubleRegex(_ *)=> 「DOUBLE」'。 –

回答

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

+0

哇,非捕獲組工作。不知道這件事。謝謝! – tuxdna