模式匹配中的Scala正则表达式

模式匹配中的Scala正则表达式,scala,pattern-matching,Scala,Pattern Matching,我有一个ADT代表我想要使用/检测的加密算法。通用类Algo包含一些实用方法,包括一个方便的自动生成的正则表达式,用于检测字符串中的Algo名称 sealed trait Algo { override def toString = this.getClass.getSimpleName.dropRight(1) val name = toString val javaName = toString.replaceFirst("HS", "HmacSHA")

我有一个ADT代表我想要使用/检测的加密算法。通用类Algo包含一些实用方法,包括一个方便的自动生成的正则表达式,用于检测字符串中的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")
  }
上述打印(请参见trait构造函数中的
println
s)正则表达式显示了我期望它们的样子,即:

.*HS256.*
.*HS348.*
.*HS512.*
但是不匹配,程序抛出异常,而不是匹配
HS256
。为什么会发生这种情况,因为这条明显等效的线路运行良好:

"__HS256__".matches(".*HS256.*")
模式
r(p)
,其中
r
是正则表达式,而
p
是另一个模式,如果该字符串与正则表达式匹配且模式
p
与正则表达式匹配的第一个捕获组匹配,则该模式与给定字符串匹配。由于您的正则表达式没有任何捕获组,因此没有任何模式与第一个捕获组匹配,甚至连模式
\uu
也不匹配


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

请查看<代码>\uuu HS512\uuu不显示
*HS512.*
,它显示所有3个regexp,然后也会引发异常。你知道为什么吗?轰!这就解决了问题。我自己根本不可能找到答案。很好。你可以把参数设置为可选(
.r(*)
)-你会得到同样的行为。@WiktorStribiżew你显示的代码不会引发异常。所有三个regexp都是打印的,因为HS512排在最后,所以所有三个都需要尝试(并因此构建)。是的,我尝试了许多变体,其中一些变体也引发了异常。我只是想知道是否所有这些都应该印刷出来。我觉得OP只需要匹配的对象。