模式匹配中的Scala正则表达式
我有一个ADT代表我想要使用/检测的加密算法。通用类Algo包含一些实用方法,包括一个方便的自动生成的正则表达式,用于检测字符串中的Algo名称模式匹配中的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")
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只需要匹配的对象。