假设我有一个正则表达式模式我想匹配许多字符串.
val Digit = """\d""".r
Run Code Online (Sandbox Code Playgroud)
我只想检查给定的String是否与Regex完全匹配.在Scala中执行此操作的好方法是什么?
我知道我可以在正则表达式上进行模式匹配,但在这种情况下,这在语法上并不是很令人满意,因为我没有要提取的组:
scala> "5" match { case Digit() => true case _ => false }
res4: Boolean = true
Run Code Online (Sandbox Code Playgroud)
或者我可以回到基础Java模式:
scala> Digit.pattern.matcher("5").matches
res6: Boolean = true
Run Code Online (Sandbox Code Playgroud)
这也不优雅.
有更好的解决方案吗?
mkn*_*ssl 63
回答我自己的问题,我将使用"pimp my library pattern"
object RegexUtils {
implicit class RichRegex(val underlying: Regex) extends AnyVal {
def matches(s: String) = underlying.pattern.matcher(s).matches
}
}
Run Code Online (Sandbox Code Playgroud)
并像这样使用它
import RegexUtils._
val Digit = """\d""".r
if (Digit matches "5") println("match")
else println("no match")
Run Code Online (Sandbox Code Playgroud)
除非有人提出更好的(标准)解决方案.
笔记
我没有皮条客String来限制潜在副作用的范围.
unapplySeq 在这种情况下读得不太好.
pol*_*nts 56
我不太了解Scala,但看起来你可以做到:
"5".matches("\\d")
Run Code Online (Sandbox Code Playgroud)
Vas*_*iuk 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
Run Code Online (Sandbox Code Playgroud)
Jac*_*ack 11
"""\d""".r.unapplySeq("5").isDefined //> res1: Boolean = true
"""\d""".r.unapplySeq("a").isDefined //> res2: Boolean = false
Run Code Online (Sandbox Code Playgroud)