Сопоставление с регулярным выражением в Scala

Я довольно часто сопоставляю строки с регулярными выражениями. В Java:

java.util.regex.Pattern.compile("\w+").matcher("this_is").matches

Ой. В Scala есть много альтернатив.

  1. "\\w+".r.pattern.matcher("this_is").matches
  2. "this_is".matches("\\\w+")
  3. "\\\w+".r unapplySeq "this_is" isDefined
  4. val R = "\\\w+".r; "this_is" match { case R() => true; case _ => false}

Первый вариант такой же тяжеловесный, как и код Java.

Проблема второго в том, что вы не можете предоставить скомпилированный шаблон ("this_is".matches("\\\w+".r")). (Похоже, это анти-паттерн, поскольку почти каждый раз, когда есть метод, который принимает regex для компиляции, есть перегрузка, которая принимает regex).

Проблема третьего варианта в том, что он злоупотребляет unapplySeq и поэтому является загадочным.

Четвертый вариант хорош при разложении частей регулярного выражения, но слишком тяжеловесен, когда вам нужен только булев результат.

Может быть, я упускаю простой способ проверки совпадений с регулярным выражением? Есть ли причина, по которой String#matches(regex: Regex): Boolean не определена? И вообще, где находится String#matches(uncompiled: String): Boolean определено?

31
задан schmmd 28 November 2011 в 20:25
поделиться