Scala Regex在模式匹配中

时间:2016-05-30 18:04:35

标签: scala pattern-matching

我有一个ADT代表我想要使用/检测的加密算法。泛型类Algo包含一些实用方法,包括一个方便的自动生成的正则表达式,用于检测字符串中的算法名称。

  sealed trait Algo {
    override def toString = this.getClass.getSimpleName.dropRight(1)
    val name = toString
    val javaName = toString.replaceFirst("HS", "HmacSHA")
    val r = s".*$name.*".r
    println(r)
  }
  case object HS256 extends Algo
  case object HS348 extends Algo
  case object HS512 extends Algo

  val someString = "__HS256__"
  val result = someString match {
          case HS256.r(_) => HS256
          case HS348.r(_) => HS348
          case HS512.r(_) => HS512
          case _ => throw new Exception("Algorithm can't be matched")
  }

以上打印(请参阅特征构造函数中的println)正则表达式我期望它们的样子,即:

.*HS256.*
.*HS348.*
.*HS512.*

但是没有匹配,程序抛出异常而不是匹配HS256。为什么会发生这种情况,因为这条明显相同的线路效果很好:

"__HS256__".matches(".*HS256.*")

1 个答案:

答案 0 :(得分:2)

模式r(p),其中r是正则表达式而p是另一种模式,如果该字符串与正则表达式匹配且模式p匹配,则匹配给定字符串首先捕获正则表达式匹配组。由于您的正则表达式没有任何捕获组,因此没有模式与第一个捕获组匹配,甚至模式_也不匹配。

要使匹配工作,请使用不尝试匹配任何捕获组的模式r(),或r(_*),无论正则表达式有多少组,它都匹配。