带有内联正则表达式的 Scala 匹配语句

Scala match statements with inline regexes

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

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

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. "fizzBuzz"是否等于"duck"?不。所以尝试下一个案例。
  2. "fizzBuzz"是否等于"lion"?不。所以尝试下一个案例。
  3. "fizzBuzz"是否等于"dog"?不。所以尝试下一个案例。
  4. "fizzBuzz" 是否匹配 fizz 正则表达式(任何以 'fizz' 开头的字符串)?是的,所以 return "heyo!"

有什么办法可以让它正常工作吗?

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

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

简单明了

使用字符串的pattern matching with 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"
    }