Scala 正则表达式模式、对象提取器

正则表达式模式


正则表示式是用于在数据中查找模式(或缺少模式)的字符串。可使用.r方法将任意字符串转化为正则表达式。

# 导入包
import scala.util.matching.Regex

# 创建正则表达式
val numberPattern: Regex = "[0-9]".r

# 匹配模式
numberPattern.findFirstMatchIn("awesomepassword") match {
  case Some(_) => println("Password OK")
  case None => println("Password must contain a number")
}

使用括号搜索正则表达式组

val keyValPattern: Regex = "([0-9a-zA-Z-#() ]+): ([0-9a-zA-Z-#()/. ]+)".r

val input: String =
  """background-color: #A03300;
    |background-image: url(img/header100.png);
    |background-position: top center;
    |background-repeat: repeat-x;
    |background-size: 2160px 108px;
    |margin: 0;
    |height: 108px;
    |width: 100%;""".stripMargin

for (patternMatch <- keyValPattern.findAllMatchIn(input))
  println(s"key: ${patternMatch.group(1)} value: ${patternMatch.group(2)}")

对象提取器


对象提取器是指具有unapply方法的对象。apply方法类似于构造器,通过参数创建对象,与之相反,unapply方法将对象恢复成参数。这经常用于模式匹配与局部函数。

import scala.util.Random

object CustomerID {
  def apply(name: String) = s"$name--${Random.nextLong}"
  
  def unapply(customerID: String): Option[String] = {
    val stringArray: Array[String] = customerID.split("--")
    if (stringArray.tail.nonEmpty) Some(stringArray.head) else None
  }
}

# 使用apply方法
val customer1ID = CustomerID("Sukyoung")  // Sukyoung--23098234908

# 使用unapply方法
customer1ID match {
  case CustomerID(name) => println(name)  // prints Sukyoung
  case _ => println("Could not extract a CustomerID")
}

由于值定义可以使用模式引入新的变量,所以提取器可以用于初始化变量,在这种情形下,unapply方法提供值。

val customer2ID = CustomerID("Nico")
val CustomerID(cc) = customer2ID
println(cc)

note:等价于val cc = CustomerID.unapply(customer2ID).get。

unapply的返回值类型可以有:

  • 如果只是测试,返回Boolean。例如,case even()
  • 如果返回类型T的单独子值,返回Option[T]
  • 如果返回多个子值T1,……,Tn,将其分组为可选元组Option[(T1,……,Tn)]

有时,提取的值的数量并不固定,希望可以根据输入返回任意数量的值。为了通过定义unapplySeq方法来实现这一目的,此方法返回一个Option[Seq[T]]。模式的常用例子包括使用case List(x, y, z)=>解构List,使用正则表达式,例如case r(name, remainingFields @ _*)=>解构字符串。

翻译源:Scala Tour

猜你喜欢

转载自blog.csdn.net/qq_32165041/article/details/83503688