声明正则表达式

通过 scala.collection.immutable.StringOps 隐式提供的 r 方法从主题字符串生成 scala.util.matching.Regex 的实例。Scala 的三引号字符串语法在这里非常有用,因为你不必像在 Java 中那样转义反斜杠:

val r0: Regex = """(\d{4})-(\d${2})-(\d{2})""".r     // :)
val r1: Regex = "(\\d{4})-(\\d{2})-(\\d{2})".r // :(

scala.util.matching.Regex 为 Scala 实现了一个惯用的正则表达式 API 作为 java.util.regex.Pattern 的包装器,支持的语法是相同的。话虽如此,Scala 对多行字符串文字的支持使得 x 标志更有用,支持注释并忽略模式空格:

val dateRegex = """(?x:
   (\d{4}) # year
  -(\d{2}) # month
  -(\d{2}) # day
)""".r

有一个重载版本的 rdef r(names: String*): Regex,它允许你为模式捕获分配组名。这有点脆弱,因为名称与捕获无关,只有在正则表达式将在多个位置使用时才应使用:

"""(\d{4})-(\d{2})-(\d{2})""".r("y", "m", "d").findFirstMatchIn(str) match {
  case Some(matched) =>
    val y = matched.group("y").toInt
    val m = matched.group("m").toInt
    val d = matched.group("d").toInt
    java.time.LocalDate.of(y, m, d)
  case None => ???
}