Как проверить, соответствует ли Строка полностью Regex в Scala?

Предположите, что у меня есть шаблон 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

который не изящен, также.

Существует ли лучшее решение?

80
задан mkneissl 11 June 2010 в 09:54
поделиться

4 ответа

Отвечая на свой собственный вопрос, я воспользуюсь шаблоном "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 не очень хорошо читается в этом контексте.

63
ответ дан 24 November 2019 в 09:56
поделиться

Я не так хорошо знаю Scala, но похоже, что вы можете просто сделать:

"5".matches("\\d")

References

56
ответ дан 24 November 2019 в 09:56
поделиться

Для полного совпадения вы можете использовать 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
13
ответ дан 24 November 2019 в 09:56
поделиться

Ответ в regex:

val Digit = """^\d$""".r

Тогда используйте один из существующих методов.

1
ответ дан 24 November 2019 в 09:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: