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

时间:2014-08-07 21:14:39

标签: 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")
}

1 个答案:

答案 0 :(得分: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")
}

但如果有任何方法可以在那里获得非字符串,那么做两步的事情真的更好。特别是,如果您不知道它是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)))

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

(感谢som-snytt修复了一种误解,多年以来一直困扰着我。)