Как проверить, полностью ли строка соответствует 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
который также не является элегантным.
Есть ли лучшее решение?
Ответы
Ответ 1
Отвечая на мой вопрос, я буду использовать шаблон "pimp my library"
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
не очень хорошо читается в этом контексте.
Ответ 2
Я не знаю Scala все, что хорошо, но похоже, что вы можете просто сделать:
"5".matches("\\d")
Ссылки
Ответ 3
Для полного соответствия вы можете использовать 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
Ответ 4
"""\d""".r.unapplySeq("5").isDefined //> res1: Boolean = true
"""\d""".r.unapplySeq("a").isDefined //> res2: Boolean = false
Ответ 5
Ответ находится в регулярном выражении:
val Digit = """^\d$""".r
Затем используйте один из существующих методов.
Ответ 6
Использование стандартной библиотеки Scala и предварительно скомпилированного шаблона регулярных выражений и шаблонов (что соответствует Scala):
val digit = """(\d)""".r
"2" match {
case digit( a) => println(a + " is Digit")
case _ => println("it is something else")
}
больше читать: http://www.scala-lang.org/api/2.12.1/scala/util/matching/index.html