繁体   English   中英

模式匹配中的Scala Regex

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM