Как проверить, полностью ли соответствует строка регулярному выражению в Scala? - PullRequest
76 голосов
/ 11 июня 2010

Предположим, у меня есть шаблон Regex, с которым я хочу сопоставить множество строк.

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

Я просто хочу проверить, соответствует ли данная строка полностью Regex.Какой хороший и идиоматичный способ сделать это в Scala?

Я знаю, что могу сопоставлять с образцом в регулярных выражениях, но это синтаксически не очень приятно в этом случае, потому что у меня нет групп для извлечения:*

scala> "5" match { case Digit() => true case _ => false }
res4: Boolean = true

Или я мог бы вернуться к базовому шаблону Java:

scala> Digit.pattern.matcher("5").matches
res6: Boolean = true

, что тоже не элегантно.

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

Ответы [ 6 ]

61 голосов
/ 11 июня 2010

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

54 голосов
/ 11 июня 2010

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

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

Ссылки

13 голосов
/ 11 июня 2010

Для полного матча вы можете использовать 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
11 голосов
/ 18 декабря 2012
  """\d""".r.unapplySeq("5").isDefined            //> res1: Boolean = true
  """\d""".r.unapplySeq("a").isDefined            //> res2: Boolean = false
1 голос
/ 12 июня 2010

Ответ в регулярном выражении:

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

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

0 голосов
/ 24 августа 2017

Использование стандартной библиотеки 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...