2014-03-03 50 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