Как проверить, полностью ли строка соответствует регулярному выражению в 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


что и совсем не элегантная.



есть ли лучшее решение?

543   6  

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 не очень хорошо читается в этом контексте.

Я не знаю 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
  """\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

    Ничего не найдено.