Предположите, что у меня есть шаблон Regex, к которому я хочу соответствовать многим Строкам.
val Digit = """\d""".r
Я просто хочу проверить, соответствует ли данная Строка полностью Regex. Что такое хороший и идиоматический способ сделать это в Scala?
Я знаю, что могу скопировать соответствие на Regexes, но это синтаксически не очень приятно в этом случае, потому что у меня нет групп для извлечения:
scala> "5" match { case Digit() => true case _ => false }
res4: Boolean = true
Или я мог отступить к базовому шаблону Java:
scala> Digit.pattern.matcher("5").matches
res6: Boolean = true
который не изящен, также.
Существует ли лучшее решение?
Отвечая на свой собственный вопрос, я воспользуюсь шаблоном "pimp my library pattern"
object RegexUtils {
implicit class RichRegex(val underlying: Regex) extends AnyVal {
def matches(s: String) = underlying.pattern.matcher(s).matches
}
}
и буду использовать его вот так
import RegexUtils._
val Digit = """\d""".r
if (Digit matches "5") println("match")
else println("no match")
если никто не предложит лучшего (стандартного) решения.
Примечания
Я не стал использовать String
, чтобы ограничить область потенциальных побочных эффектов.
unapplySeq
не очень хорошо читается в этом контексте.
Я не так хорошо знаю Scala, но похоже, что вы можете просто сделать:
"5".matches("\\d")
Для полного совпадения вы можете использовать unapplySeq. Этот метод пытается найти совпадение с целью (полное совпадение) и возвращает совпадения.
scala> val Digit = """\d""".r
Digit: scala.util.matching.Regex = \d
scala> Digit unapplySeq "1"
res9: Option[List[String]] = Some(List())
scala> Digit unapplySeq "123"
res10: Option[List[String]] = None
scala> Digit unapplySeq "string"
res11: Option[List[String]] = None
Ответ в regex:
val Digit = """^\d$""".r
Тогда используйте один из существующих методов.