如何检查一个string是否完全匹配Scala中的正则expression式?

假设我有一个正则expression式模式,我想匹配很多string。

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

我只是想检查给定的string是否完全匹配正则expression式。 在Scala中做这件事的好方法是什么?

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

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

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

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

这也不是优雅的。

有更好的解决scheme吗?

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

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

参考

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

 object RegexUtils { class RichRegex(underlying: Regex) { def matches(s: String) = underlying.pattern.matcher(s).matches } implicit def regexToRichRegex(r: Regex) = new RichRegex(r) } 

像这样使用它

 import RegexUtils._ val Digit = """\d""".r if (Digit matches "5") println("match") else println("no match") 

除非有人提出更好的(标准)解决scheme。

笔记

  • 我没有皮条客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 

答案是在正则expression式中:

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

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

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