采取你的正则表达式:
"([^"]*)"(.*$)
当编译时.r
,这个字符串产生一个regex
object - 如果它与输入字符串匹配,则必须产生2捕获的字符串 - 一个用于([^"]*)
另一个为(.*$)
。你的代码
case regex(token) => ...
应该反映这一点,所以也许你想要
case regex(token, otherStuff) => ...
Or just
case regex(token, _) => ...
为什么?因为case regex(matchedCaputures...)
语法之所以有效,是因为regex
是一个
对象与unapplySeq
方法。case regex(token) => ...
翻译(大致)为:
case List(token) => ...
Where List(token)
是什么regex.unapplySeq( inputString )
返回:
regex.unapplySeq("\"test\"") // Returns Some(List("test", ""))
你的正则表达式确实匹配字符串"test"
但在case
声明正则表达式提取器的unapplySeq
方法返回一个列表2字符串,因为这就是正则表达式所说的它捕获的内容。不幸的是,编译器在这里无法帮助您,因为正则表达式是在运行时从字符串编译的。
一种替代方法是使用非捕获组:
val stringRegex = """"([^"]*)"(?:.*$)"""
// ^^
那么你的代码就可以工作了,因为regex
现在将是一个提取器对象,其unapplySeq
方法仅返回单个捕获组:
tidyTokens foreach {
case regex(token) => println (token + " matches!")
case t => println ("No match for token " + t)
}
看看教程提取器对象 http://www.scala-lang.org/node/112,为了更好地理解
如何apply
/ unapply
/ unapplySeq
works.