我有点困难。 (我是regexp的专家,但在scala / java中没有太多使用它们)。 我有11个字符长度的数字字符串,只需要最后10个,所以:
val Pattern = """(\d{10})$""".r
"79283767219" match {
case Pattern(m) => m
}
它给出MatchError
,但为什么?!我误解了什么?
答案 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
。