2014-03-03 90 views
5

如何使用正則表達式對數組中的第一個字符串元素進行模式匹配?使用正則表達式的Scala數組模式匹配

考慮例如

Array("col",1) match { 
    case Array("""col | row""", n, _*) => n 
    case _ => 0 
} 

它提供0,雖然期望的結果將是1。

非常感謝。

回答

7

一個Regex例如自動提供的提取,這樣你就可以在一個模式匹配表達式直接使用一個:

val regex = "col|row".r 

Array("col",1) match { 
    case Array(regex(), n, _*) => n 
    case _ => 0 
} 

另外:在繞Scala的正則表達式更一般的QA,sschaef有provided a very nice string interpolation for pattern matching usage(如在本例中爲)。一個潛在的警告:插值會在每次調用時創建一個新的Regex實例 - 因此,如果您使用相同的正則表達式很多次,它可以更有效地將它存儲在val而不是(如此答案中)。

+0

這絕對比我的解決方案更好 – serejja

+0

這是一個大膽的回覆。 –

+0

@serejja:好吧,可能更有效率,可以說是更具可讀性 - 也許;)。無論如何謝謝。 –

2

不知道這是否是最好的解決辦法,但工作之一:

Array("col", 1) match { 
    case Array(str: String, n, _*) if str.matches("col|row") => n //note that spaces are removed in the pattern 
    case _ => 0 
} 
+1

請注意,它是一個'Array [Any]',你的結果也是'Any'。 –

+0

非常感謝您的回答和評論。 – elm