Scala匹配语句与内联正则表达式

时间:2016-10-06 10:12:11

标签: regex scala string-matching

我正在尝试(如果可能的话)获取Scala匹配/ case语句来为我执行内联正则表达式匹配。

具体来说,我有一个运行match的方法,如果方法的输入以字符串“fizz”开头,那么我希望match语句选择正确的大小写:

def animalToSound(animal : String) : String = {
    animal match {
        case "duck"   =>    "quack"
        case "lion"   =>    "roar"
        case "dog"    =>    "woof"
        case matchesFizzRegex(animal) =>  "heyo!"
        case _        =>    "meow"
    }
}

def matchesFizzRegex(animal : String) : ??? = {
    val fizzRegex = "fizz*".r
    if(fizzRegex.match(animal)) {
        ???
    } else {
        ???
    }
}

因此,如果我致电animalToSound("fizzBuzz"),那么所需的行为是:

  1. “fizzBu​​zz”是否等于“鸭子”?不,请尝试下一个案例。
  2. “fizzBu​​zz”是否等于“狮子”?不,请尝试下一个案例。
  3. “fizzBu​​zz”是否等于“狗”?不,请尝试下一个案例。
  4. “fizzBu​​zz”是否匹配fizz正则表达式(任何以'fizz'开头的字符串)?是的,所以返回“heyo!”
  5. 我有什么想法可以让它正常工作?

2 个答案:

答案 0 :(得分:9)

简单直接

使用字符串

pattern matching guardsmatches方法
def animalToSound(animal : String) : String = animal match {
        case "duck"   =>    "quack"
        case "lion"   =>    "roar"
        case "dog"    =>    "woof"
        case x if x matches "fizz.*" =>  "heyo!"
        case _        =>    "meow"
    }

答案 1 :(得分:3)

您可以在其他情况下匹配正则表达式:

val reg = "fizz.*".r
animal match {
    case "duck"   =>    "quack"
    case "lion"   =>    "roar"
    case "dog"    =>    "woof"
    case `reg`    =>    "heyo!"
    case _        =>    "meow"
}