如何检查字符串是否完全匹配 Scala 中的正则表达式?

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

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

我只想检查给定的 String 是否完全匹配正则表达式。在 Scala 中有什么好的和惯用的方法来做到这一点?

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

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

或者我可以回到底层的 Java 模式:

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

这也不优雅。

还有更好的解决办法吗?

62270 次浏览

我不是很了解 Scala,但是看起来你可以这样做:

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

参考文献

对于完全匹配,可以使用 < strong > unapplicySeq 。此方法尝试匹配目标(完全匹配)并返回匹配。

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

回答我自己的问题,我将使用“皮条客我的图书馆模式”

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读起来不是很好。

答案就在正则表达式中:

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

然后使用现有的方法之一。

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

使用标准 Scala 库和预编译的 regex 模式和模式匹配(这是 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