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