我正在进行scala模式匹配。
对于下面的程序,我得到输出。
val pattern = "([0-9]+) ([A-Za-z]+)".r
val pattern(count,fruit) ="100 bananas"
程序的输出是
count:String = 100 水果:String =香蕉
我通过在模式val对象中再添加一个数字模式以及在提取模式val中再添加一个对象来修改程序以加深理解。
该计划
val pattern = "([0-9]+) ([A-Za-z]+) ([0-9]+) ".r
val pattern(count, fruit, price) ="100 bananas 1002"
但该程序没有编译,它正在抛出错误。错误是 -
scala.MatchError: 100 bananas 1002 (of class java.lang.String)
at #worksheet#.x$1$lzycompute(ExtractingStrings.sc0.tmp:6)
at #worksheet#.x$1(ExtractingStrings.sc0.tmp:6)
at #worksheet#.count$lzycompute(ExtractingStrings.sc0.tmp:6)
at #worksheet#.count(ExtractingStrings.sc0.tmp:6)
at #worksheet#.#worksheet#(ExtractingStrings.sc0.tmp:6)
任何人都可以解释为什么它会抛出这个错误。提前谢谢。
答案 0 :(得分:4)
该程序编译得很好。您得到的是运行时异常(scala.MatchError)。
这是因为您的第二个模式"([0-9]+) ([A-Za-z]+) ([0-9]+) "
在([A-Za-z]+)
之后有2个空格,而在([0-9]+)
和100 bananas 1002
之后的另一个空格与该模式不匹配(一个空格)在bananas
之后1002
之后没有空格。
删除这些空格,将模式更改为([0-9]+) ([A-Za-z]+) ([0-9]+)"
,它将起作用。
scala> val pattern = "([0-9]+) ([A-Za-z]+) ([0-9]+)".r
pattern: scala.util.matching.Regex = ([0-9]+) ([A-Za-z]+) ([0-9]+)
scala> val pattern(count, fruit, price) ="100 bananas 1002"
count: String = 100
fruit: String = bananas
price: String = 1002