宣告正規表示式

通過 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 => ???
}