【问题标题】:Scala match statements with inline regexes带有内联正则表达式的 Scala 匹配语句
【发布时间】:2016-10-06 10:12:10
【问题描述】:

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

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

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”是否等于“duck”?不,所以请尝试下一个案例。
  2. “fizzBu​​zz”是否等于“lion”?不,所以请尝试下一个案例。
  3. “fizzBu​​zz”是否等于“dog”?不,所以请尝试下一个案例。
  4. “fizzBu​​zz”是否匹配 fizz 正则表达式(任何以“fizz”开头的字符串)?是的,所以返回“嘿嘿!”

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

【问题讨论】:

    标签: regex scala string-matching


    【解决方案1】:

    简单直接

    使用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"
        }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2016-01-16
        • 2017-10-27
        • 1970-01-01
        • 2020-08-28
        • 2013-09-13
        • 1970-01-01
        • 1970-01-01
        • 2016-05-11
        • 1970-01-01
        相关资源
        最近更新 更多