是否可以从Regex字符类中获得Char => Boolean
函数而无需每次都编译模式?
这会进行类型检查,但每次都会重新编译该模式,效率低下:
val f: Char => Boolean = c => c.toString.matches("[bgjkqtz]")
答案 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)