4

我有些为难。(我是正则表达式的专家,但在 scala/java 中使用得不多)。我有长度为 11 个字符的数字字符串,只需要最后 10 个,所以:

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

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

4

3 回答 3

11

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

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

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

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

于 2013-01-31T14:47:52.987 回答
7

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

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

更新:在您使用 Scala 2.10 并且可以使用 Daniel 之前,unanchored您可以像这样解决它:

Pattern.findFirstIn("79283767219")
于 2013-01-31T14:39:13.197 回答
3

请注意,当在构造中使用示例中的RegEx实例时,它不是搜索,而是匹配!这意味着它必须匹配被匹配的整个值(在 Scala 中称为“检查者”——在您的示例中为 <code>79283767219)。Patternmatch

这就解释了为什么你的例子得到了MatchError.

于 2013-01-31T14:44:41.310 回答