在正则选项匹配中嵌套正则表达式

Dan*_*ins 0 scala

我有代码检查JSON对象是否有一个有效的日期字段.我意识到我可能有一些(s)情况,然后在该函数中嵌套另一个"匹配",但我想知道是否有更简洁的方法在顶级"匹配"中执行此操作.这是我尝试过的代码,但不会返回"成功".我认为有一种方法可以实现这一点,因为很多人都在谈论scala模式匹配的稳健性.谢谢!

val p = """(\d\d\d\d)-(\d\d)-(\d\d)""".r

(json \ "date").validate[String].asOpt match {
    case Some(p(date)) => Json.obj("success"->date)
    case None => Json.obj("error"->"missing date")
    case _ => Json.obj("error"->"invalid date")
}
Run Code Online (Sandbox Code Playgroud)

Rex*_*err 5

你可以像这样写:

val p = """(\d\d\d\d)-(\d\d)-(\d\d)""".r
Option("2014-08-07") match {
  case Some(p(year,month,day)) => println("Yay")
  case None => println("Boo")
}
Run Code Online (Sandbox Code Playgroud)

但如果有任何方法可以在那里获得非字符串,那么做两步的事情真的更好.特别是,如果你不知道它是一个Option[String]但只是一个Any,弄清楚它是一个字符串是一个重要的单独步骤.你可以为它编写一个提取器:

object IsString {
  def unapply(a: Any): Option[String] = a match {
    case s: String => Some(s)
    case _ => None
  }
}
// Then Some(IsString(p(y,m,d)))
Run Code Online (Sandbox Code Playgroud)

如果您不需要验证匹配的三个组,p(_*)则只测试模式的存在.

(感谢som-snytt修复了一种错误观念,多年以来一直在我的脑海中挥之不去.)