不推荐使用 - Scala正则表达式模式匹配

时间:2016-11-07 16:22:23

标签: regex scala deprecation-warning

目前,在Scala 2.11中,不鼓励在模式匹配中使用正则表达式,除非您与Seq [Char]或Match匹配,否则有另一种方法。目前我已经在下面的示例中使用Seq [Char]策略实现了一个getValueV2,虽然它很冗长且看起来不够好。

您有什么其他建议来替换正则表达式,

trait MyHelper {
  //param Regex is deprecated
 def getValue(option: Option[scala.Any]): String = {
  val param = """(?:String|Boolean)Option\((.*)\)""".r
  option.getOrElse("") match {
    case param(s) => s
    case arr: Array[_] => arr.mkString("")
    case _ => ""
  }
}

def getValueV2(option: Option[scala.Any]): String = {
  option.getOrElse("") match {
      case s : String => s.toSeq match {
        case p if p.endsWith(")") => p match {
        case Seq('S', 't', 'r', 'i', 'n', 'g', 'O', 'p', 't', 'i', 'o', 'n', '(', suffix@_*) => suffix.toString.substring(0, suffix.length -1)
          case Seq('B', 'o', 'o', 'l', 'e', 'a', 'n', 'O', 'p', 't', 'i', 'o', 'n', '(',  suffix@_*) => suffix.toString.substring(0, suffix.length -1)
          case _ => s                   
        }
        case _ => s 
      }
      case arr: Array[_] => arr.mkString("")
      case _ => ""
    }
  }
}

我一直在寻找另一个名为kantan.regex的图书馆,但它似乎没有一个庞大的社区。这里最好的方法是什么,只需保留正则表达式并忽略已弃用的警告?

1 个答案:

答案 0 :(得分:2)

由于您只对匹配String输入感兴趣,请在应用Regex之前测试类型。

def getValue(option: Option[scala.Any]): String = {
  val param = """(?:String|Boolean)Option\((.*)\)""".r
  option.getOrElse("") match {
    case str: String => str match {
      case param(s) => s
      case _ => ""
    }
    case arr: Array[_] => arr.mkString("")
    case _ => ""
  }
}

编译时没有任何警告。