【问题标题】:Deprecated - Scala Regex Pattern Matching已弃用 - Scala 正则表达式模式匹配
【发布时间】:2016-11-08 01:01:03
【问题描述】:

目前从 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 的库,但它似乎没有一个大社区。这里最好的方法是什么,只需使用正则表达式并忽略已弃用的警告?

【问题讨论】:

    标签: regex scala deprecation-warning


    【解决方案1】:

    由于您只对匹配 String 输入感兴趣,因此在应用正则表达式之前测试类型。

    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 _ => ""
      }
    }
    

    编译时没有警告。

    【讨论】:

    • 几乎完美,我建议的唯一解决方法是第一个 case _ => "" 应该是 case _ => str
    • 您原来的getValue 没有这个结果,但我现在看到它已添加到V2。很好。我敢肯定还有其他模组可以满足您的要求。关键是您可以(并且应该)以非弃用的方式使用 Regex 模式。
    猜你喜欢
    • 2019-11-01
    • 1970-01-01
    • 2014-04-04
    • 2019-07-14
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多