首页 文章

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

提问于
浏览
71

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

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 回答

  • 54

    回答我自己的问题,我将使用“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")
    

    除非有人提出更好的(标准)解决方案 .

    Notes

    • 我没有皮条客 String 来限制潜在副作用的范围 .

    • unapplySeq 在该上下文中读得不太好 .

  • 50

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

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

    参考文献

  • -1

    对于完整比赛,您可以使用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
    
  • 13
    """\d""".r.unapplySeq("5").isDefined            //> res1: Boolean = true
      """\d""".r.unapplySeq("a").isDefined            //> res2: Boolean = false
    
  • 3

    答案在正则表达式中:

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

    然后使用现有方法之一 .

  • 10

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

相关问题