我有一个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.*")
答案 0 :(得分:2)
模式r(p)
,其中r
是正则表达式而p
是另一种模式,如果该字符串与正则表达式匹配且模式p
匹配,则匹配给定字符串首先捕获正则表达式匹配组。由于您的正则表达式没有任何捕获组,因此没有模式与第一个捕获组匹配,甚至模式_
也不匹配。
要使匹配工作,请使用不尝试匹配任何捕获组的模式r()
,或r(_*)
,无论正则表达式有多少组,它都匹配。