如何检查String是否与Scala中的Regex完全匹配?

时间:2010-06-11 09:54:41

标签: regex scala

假设我有一个正则表达式模式我想要匹配许多字符串。

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

我只想检查给定的String是否与Regex完全匹配。在Scala中执行此操作的好方法是什么?

我知道我可以在Regexes上进行模式匹配,但在这种情况下,这在语法上并不令人满意,因为我没有要提取的组:

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

或者我可以回到基础Java模式:

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

也不优雅。

有更好的解决方案吗?

6 个答案:

答案 0 :(得分:59)

回答我自己的问题我将使用“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在这种情况下读得不太好。

答案 1 :(得分:53)

我不太了解Scala,但看起来你可以做到:

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

参考

答案 2 :(得分:13)

对于完整匹配,您可以使用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

答案 3 :(得分:11)

  """\d""".r.unapplySeq("5").isDefined            //> res1: Boolean = true
  """\d""".r.unapplySeq("a").isDefined            //> res2: Boolean = false

答案 4 :(得分:1)

答案在正则表达式中:

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

然后使用现有方法之一。

答案 5 :(得分:-1)

使用标准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