Как проверить, полностью ли строка соответствует регулярному выражению в Scala?
предположим, что у меня есть шаблон регулярного выражения, которому я хочу соответствовать многим строкам.
val Digit = """d""".r
Я просто хочу проверить, полностью ли данная строка соответствует регулярному выражению. Какой хороший и идиоматические способ сделать это в Scala?
Я знаю, что я могу сопоставить шаблон на регулярных выражениях, но это синтаксически не очень приятно в этом случае, потому что у меня нет групп для извлечения:
scala> "5" match { case Digit() => true case _ => false }
res4: Boolean = true
или я мог бы вернуться к базовому шаблону Java:
scala> Digit.pattern.matcher("5").matches
res6: Boolean = true
что и совсем не элегантная.
есть ли лучшее решение?
6 ответов:
отвечая на мой собственный вопрос, я буду использовать "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не очень хорошо читается в этом контексте.
для полного совпадения вы можете использовать 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
"""\d""".r.unapplySeq("5").isDefined //> res1: Boolean = true """\d""".r.unapplySeq("a").isDefined //> res2: Boolean = false
ответ находится в регулярном выражении:
val Digit = """^\d$""".rзатем используйте один из существующих методов.
используя стандартную библиотеку 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
Comments