带有$的Scala正则表达式(字符串结尾)

dmi*_*try 4 regex scala

我有点困难.(我是regexp的专家,但在scala/java中没有太多使用它们).我有11个字符长度的数字字符串,只需要最后10个,所以:

val Pattern = """(\d{10})$""".r
"79283767219" match {
  case Pattern(m) => m
}
Run Code Online (Sandbox Code Playgroud)

它给了MatchError,但为什么?!我误解了什么?

Dan*_*ral 11

当您匹配正则表达式模式时,正则表达式模式应匹配整个字符串.也就是说,它就像正则表达式模式一样开始^并以结束$.这背后的原因是a match应该解构右侧的整个左侧.

使用Scala 2.10,您可以调用unanchored以获取将执行部分匹配的匹配器,如下所示:

val Pattern = """(\d{10})$""".r.unanchored
Run Code Online (Sandbox Code Playgroud)

请放心,您的锚将被保留.这只是期望匹配应该应用于将被删除的整个字符串.


om-*_*nom 7

因为您有11位数字,而不是10.您可以设置"10和更多" {10,}.要仅匹配字符串的结尾,您需要明确指定完整模式:

 val Pattern = """.*(\d{10})$""".r
Run Code Online (Sandbox Code Playgroud)

更新:直到你使用Scala 2.10并且你可以使用Daniel's,unanchored你可以像这样解决它:

Pattern.findFirstIn("79283767219")
Run Code Online (Sandbox Code Playgroud)

  • @dmitry它在scaladoc上为`unapplySeq`指定. (2认同)