从正则表达式字符类中获取char谓词`Char => Boolean`?

时间:2018-12-31 19:33:46

标签: regex scala performance predicate

是否可以从Regex字符类中获得Char => Boolean函数而无需每次都编译模式?

这会进行类型检查,但每次都会重新编译该模式,效率低下:

val f: Char => Boolean = c => c.toString.matches("[bgjkqtz]")

4 个答案:

答案 0 :(得分:3)

您可以使用模式匹配。

val myChars = "[bgjkqtz]".r  //compiled once

def predicate(c :Char) :Boolean = c match {
  case myChars() => true
  case _ => false
}

但是我不知道它的性能如何,因为这还会涉及对unapplySeq()isEmpty()的基础调用。

答案 1 :(得分:3)

怎么样?

// compiles a regular expression `rgx` into a predicate on characters.
def toPred(rgx: String): Char => Boolean = {
  val p = rgx.r.pattern
  c => p.matcher(c.toString).matches
}

它一次编译模式p,然后将其存储在闭包中。例子:

scala> val f = toPred("[abcdef]")
scala> f('a')
res5: Boolean = true

scala> f('x')
res6: Boolean = false

答案 2 :(得分:1)

"[fkadjd]".replaceAll("[\[\]]").toSet怎么样?

Set[Char] Char => Boolean,您实际上不需要正则表达式来匹配字符...

答案 3 :(得分:0)

您提供的特定示例不需要正则表达式,因为它仅检查c是否在一组字符中。可以使用contains

val f: Char => Boolean = c => "bgjkqtz".contains(c)