我有些为难。(我是正则表达式的专家,但在 scala/java 中使用得不多)。我有长度为 11 个字符的数字字符串,只需要最后 10 个,所以:
val Pattern = """(\d{10})$""".r
"79283767219" match {
case Pattern(m) => m
}
它给出了MatchError
,但是为什么呢?!我误解了什么?
当您匹配正则表达式模式时,正则表达式模式应该匹配整个字符串。也就是说,它就像正则表达式模式以 . 开头^
和结尾$
。这背后的原因是 amatch
应该在右侧解构整个左侧。
使用 Scala 2.10,您可以调用unanchored
以获取将进行部分匹配的匹配器,如下所示:
val Pattern = """(\d{10})$""".r.unanchored
请放心,您的锚将被保留。只是期望匹配应该应用于将被删除的整个字符串。
因为您有 11 位数字,而不是 10。您可以使用 设置“10 及更多” {10,}
。要仅匹配字符串的结尾,您需要显式指定完整模式:
val Pattern = """.*(\d{10})$""".r
更新:在您使用 Scala 2.10 并且可以使用 Daniel 之前,unanchored
您可以像这样解决它:
Pattern.findFirstIn("79283767219")
请注意,当在构造中使用示例中的RegEx
实例时,它不是搜索,而是匹配!这意味着它必须匹配被匹配的整个值(在 Scala 中称为“检查者”——在您的示例中为 <code>79283767219)。Pattern
match
这就解释了为什么你的例子得到了MatchError
.