Я довольно часто сопоставляю строки с регулярными выражениями. В Java:
java.util.regex.Pattern.compile("\w+").matcher("this_is").matches
Ой. В Scala есть много альтернатив.
"\\w+".r.pattern.matcher("this_is").matches
"this_is".matches("\\\w+")
"\\\w+".r unapplySeq "this_is" isDefined
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
определено?