Возьмите свое регулярное выражение:
"([^"]*)"(.*$)
При компиляции с .r
эта строка дает объект regex
, который, если он соответствует входной строке, должен давать 2 захваченные строки — одну для ([^"]*)
, а другую для (.*$)
. Ваш код
case regex(token) => ...
Должен отразить это, так что, может быть, вы хотите
case regex(token, otherStuff) => ...
Или просто
case regex(token, _) => ...
Почему? Поскольку синтаксис case regex(matchedCaputures...)
работает, потому что regex
— это объект с методом unapplySeq
. case regex(token) => ...
переводится (примерно) как:
case List(token) => ...
Где 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)
}
Ознакомьтесь с руководством по Extractor Objects, чтобы лучше понять, как apply
/ unapply
/ unapplySeq
работает.
person
Faiz
schedule
27.02.2013