Scala:模式在字符串开头匹配零或更多

时间:2015-02-06 22:12:19

标签: scala

如何进行模式匹配以匹配最后一个元素的所有元素?

例如,假设我有这个unapplySeq:

object MyObject {
  def unapplySeq(money: String): Option[List[Char]] = {
    val amount = money.trim.toList
    if (amount.isEmpty) None
    else
      Some(amount)
  }
}

我尝试以下比赛:

"12.15 €" match {
    case MyObject('$' , last @ _*) =>   s"${last.mkString} dollars"

    // this is wrong
    case MyObject(first @ _*, '€') =>   s"${last.mkString} euro"  

    case _ => "Unknown format"
}

我可以为美国金额执行此操作,例如我传给$ 120.10,但是如何重写第二种情况以匹配符号在末尾的欧元字符串?

2 个答案:

答案 0 :(得分:2)

使用Regex

这将非常简单
def currency(s: String) {
  val dollar = """\$(.+)""".r
  val euro = """(.+)€""".r  
  s match {
    case dollar(amt) => println(amt + " dollars")
    case euro(amt) => println(amt + " euros")
    case _ => println("unknown currency")
  }
}

scala> currency("$1346.00")
1346.00 dollars

scala> currency("1346.00€")
1346.00 euros

答案 1 :(得分:1)

可能,正则表达式过度表达" startsWith"和" endsWith"。

一个简单的提取器完成这项工作,但是让字符串完成它是一个低于字符串列表的缺口。

scala> object Currency { def unapply(s: String): Option[(Char, String)] =
     | if (s.head == '$') Some('$',s.tail)
     | else if (s.last == '€') Some('€',s.init) else None }
defined object Currency

scala> def currency(s: String) = s match { case Currency(c, amt) => s"$amt of $c" case _ => "unknown" }
currency: (s: String)String

scala> currency("$120.10")
res2: String = 120.10 of $

scala> currency("1346.00€")
res3: String = 1346.00 of €

毫无疑问,您真的会提取货币枚举和数字。