[英]Scala Regex within a 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")
}
上面的代码(请参阅trait构造函数中的println
打印了正则表达式,我希望它们看起来像:
.*HS256.*
.*HS348.*
.*HS512.*
但是没有匹配项,程序将抛出异常而不是匹配HS256
。 为什么会发生这种情况,因为这显然是等效的行:
"__HS256__".matches(".*HS256.*")
模式r(p)
,其中r
是正则表达式, p
是另一个模式,如果该字符串与正则表达式匹配且模式p
与正则表达式匹配的第一个捕获组匹配,则该模式r(p)
匹配给定的字符串。 由于您的正则表达式没有任何捕获组,因此没有任何模式将匹配第一个捕获组,甚至没有模式_
。
为了使匹配有效,请使用模式r()
不尝试匹配任何捕获组),或使用r(_*)
进行匹配,而不考虑正则表达式有多少个组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.