Scala声明正则表达式

示例

r通过scala.collection.immutable.StringOps隐式提供的方法从主题字符串生成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

有一个重载版本的r,def 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 => ???
}