簡體   English   中英

Scala,模式匹配,字符串

[英]Scala, pattern matching, strings

有沒有辦法匹配scala中的字符串,如下所示:

  def matcher(arg: String) : Expr = {
    case left :: '*' :: right => new Binary("*", left, right)
    case left :: '+' :: right => new Binary("+", left, right)
  }

哪里左右都有String類型?

您可以通過匹配正則表達式來實現目標。

trait Expr

case class Binary(op: String, leftOperand: String, rightOperand: String) extends Expr

val mulPattern = "(\\d*)\\*(\\d*)".r
val addPattern = "(\\d*)\\+(\\d*)".r

def matcher(arg: String) : Expr = {
  arg match {
    case mulPattern(left, right) => new Binary("*", left, right)
    case addPattern(left, right) => new Binary("+", left, right)
  }
}

def main(args: Array[String]): Unit = {
  println(matcher("1+2")) // Binary("+", "1", "2")
  println(matcher("3*4")) // Binary("*", "3", "4")
} 

我不這么認為。

你也許可以做到這一點,如果你轉換String成一個ListVectorChar ,然后恢復的結果mkString 但我無法想出一些東西。

但是,imo,正則表達式會更簡潔和可讀:

trait Expr

case class Binary(op: String, left: String, right: String) extends Expr

val Expression = """(.*?)\s*([+-\/\^\*])\s*(.*)""".r
def matcher(arg: String) : Expr = arg match {
  case Expression(left, op, right) => new Binary(op, left, right)
}

val test = matcher("a + b")
val test2 = matcher("a * b")

您也可以使用提取器執行此操作:

object Mult {
  def unapply(x: String): Option[(String, String)] = x.split("\\*") match {
    case Array(a: String, b: String) => Some(a -> b)
    case _ => None
  }
}

object Add {
  def unapply(x: String): Option[(String, String)] = x.split("\\+") match {
    case Array(a: String, b: String) => Some(a -> b)
    case _ => None
  }
}

def matcher(arg: String) = arg match {
    case Mult(left, right) => Binary("*", left, right)
    case Add(left, right) => Binary("+", left, right)
    case _ => println("not matched")
 }

您可能還想為每個提取器實現apply方法,如:

def apply(l: String, r: String) = s"$l*$r"

但這不是強制性的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM