Получить предикат char `Char => Boolean` из класса символов Regex? - PullRequest
0 голосов
/ 31 декабря 2018

Можно ли получить функцию Char => Boolean из класса символов Regex без компиляции шаблона каждый раз?

Это выполняет проверку типов, но каждый раз перекомпилирует шаблон, что неэффективно:

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

Ответы [ 4 ]

0 голосов
/ 01 января 2019

Конкретный пример, который вы приводите, не нуждается в регулярном выражении, потому что он просто проверяет, что c находится в наборе символов.Это можно сделать с помощью contains:

val f: Char => Boolean = c => "bgjkqtz".contains(c)
0 голосов
/ 31 декабря 2018

Как насчет этого?

// 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
0 голосов
/ 31 декабря 2018

Как насчет "[fkadjd]".replaceAll("[\[\]]").toSet?

Set[Char] - это a Char => Boolean, вам не нужно регулярное выражение для сопоставления с символом ...

0 голосов
/ 31 декабря 2018

Вы можете использовать сопоставление с образцом.

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

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

Но я не знаю, насколько это будет производительно, так как это также будет связано с базовыми вызовами unapplySeq() и isEmpty().

...