[英]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
成一个List
或Vector
的Char
,然后恢复的结果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.