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

时间:2013-01-31 14:33:27

标签: regex scala

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

val Pattern = """(\d{10})$""".r
"79283767219" match {
  case Pattern(m) => m
}

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

3 个答案:

答案 0 :(得分:10)

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

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

val Pattern = """(\d{10})$""".r.unanchored

请务必保留您的锚点。这只是期望匹配应该应用于将要删除的整个字符串。

答案 1 :(得分:7)

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

 val Pattern = """.*(\d{10})$""".r

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

Pattern.findFirstIn("79283767219")

答案 2 :(得分:3)

请注意,当您的示例中的RegEx实例(例如Pattern}用于match构造时,它一个搜索,它是一个 match!意味着它必须匹配匹配的整个值(在Scala的说法中称为“scrutinee” - 在您的示例中为79283767219)。

解释了为什么您的示例有MatchError