Шаблон регулярных выражений в шаблоне класса Case с использованием Scala

Это должно быть что-то глупое, но мне интересно, может ли кто-нибудь помочь мне здесь. Следующее совпадение с шаблоном регулярного выражения в соответствии с классом case не работает, как я ожидал. Может ли кто-нибудь дать некоторое представление? Спасибо.

object Confused {

  case class MyCaseClass(s: String)

  val WS = """\s*""".r

  def matcher(myCaseClass: MyCaseClass) = myCaseClass match {
    case MyCaseClass(WS(_)) => println("Found WS")
    case MyCaseClass(s) => println(s"Found >>$s<<")
  }

  def main(args: Array[String]): Unit = {
    val ws = " "

    matcher(MyCaseClass(ws))
  }
}

Я бы ожидал, что первый случай в совпадении с образцом будет тем, который соответствует, но это не так.

Это печатает

Найдено >> ‹‹


person Bill Barrington    schedule 31.08.2015    source источник


Ответы (1)


Должен быть:

val WS = """(\s*)""".r

Для вашего вопроса вы хотите сопоставить шаблон пробелов, в Scala,

Регулярное выражение используется для определения соответствия строки шаблону и, если соответствует, для извлечения или преобразования соответствующих частей.

для извлечения частей совпадения нам нужно использовать group для создания шаблона строки. Это означает, что нам нужно использовать parentheses вокруг нашей строки шаблона.

Пример:

val date = """(\d\d\d\d)-(\d\d)-(\d\d)""".r
"2004-01-20" match {
  case date(year, month, day) => s"$year was a good year for PLs."
}
person chengpohi    schedule 31.08.2015
comment
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и/или как этот код отвечает на вопрос, повышает его ценность в долгосрочной перспективе. - person NathanOliver; 31.08.2015
comment
@NathanOliver, спасибо, я добавил подробности для объяснения. - person chengpohi; 31.08.2015