2015-10-10 13 views
5

Có cách để phù hợp với chuỗi trong scala như thế này:Scala, mô hình phù hợp, chuỗi

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

nơi trái và phải được có kiểu String?

+0

Là trái và phải của chiều dài cố định? –

Trả lời

9

Bạn có thể đạt được mục tiêu của mình bằng cách kết hợp trên biểu thức thông thường.

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") 
} 
+1

có thể tạo một phương thức để tạo các mẫu đó, có thể như sau: 'def binRegex (ký hiệu: Char) = raw" "" ([^ $ symbol] +) [$ symbol] ([^ $ symbol] +) "" " .r' –

+0

Cảm ơn câu trả lời của bạn, thưa bạn! – DoSofRedRiver

2

Tôi không nghĩ vậy.

Bạn có thể có thể làm điều đó, nếu bạn chuyển đổi các String thành một List hoặc Vector của Char và sau đó phục hồi các kết quả với mkString. Nhưng tôi không thể nghĩ ra điều gì đó.

Tuy nhiên, imo, một biểu thức chính quy sẽ được thêm súc tích và dễ đọc:

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") 
+0

Cảm ơn bạn đã chúc mừng! – DoSofRedRiver

1

Bạn cũng có thể làm điều này với nhổ:

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") 
} 

Bạn cũng có thể muốn thực hiện áp dụng phương pháp cho từng vắt như:

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

nhưng điều này là không bắt buộc

+0

Dường như giải pháp của bạn phù hợp với tôi nhất, cảm ơn bạn! – DoSofRedRiver

Các vấn đề liên quan