为什么在尝试获取此捕获组时会出现 MatchError?

Why do I get a MatchError when trying to grab this capturing group?

我有一个正则表达式问题。这是一个正则表达式,用于从 url 中获取 id - 不区分大小写:

scala> val idRegex = """(?i)images\/(.*)\.jpg""".r
idRegex: scala.util.matching.Regex = (?i)images\/(.*)\.jpg

它符合我的主题:

scala> val slidephotoId = idRegex.findFirstIn("/xml/deliverables/images/23044.jpg")
slidephotoId: Option[String] = Some(images/23044.jpg)

但是当我将它用作提取器时,出现匹配错误:

scala> val idRegex(id) = "/xml/deliverables/images/23044.jpg"
scala.MatchError:/xml/deliverables/images/23044.jpg (of class java.lang.String)
  ... 43 elided

我哪里做错了?

Scala 中的正则表达式默认是锚定的(意思是 - 它们必须匹配整个输入)- 如果你让你的正则表达式不锚定 - 这会起作用:

scala> val idRegex = """(?i)images\/(.*)\.jpg""".r.unanchored
idRegex: scala.util.matching.UnanchoredRegex = (?i)images\/(.*)\.jpg

scala> val idRegex(id) = "/xml/deliverables/images/23044.jpg"
id: String = 23044

当然,另一种选择是更改正则表达式,使其占整个输入,例如:

scala> val idRegex = """(?i).+images\/(.*)\.jpg""".r
idRegex: scala.util.matching.Regex = (?i).+images\/(.*)\.jpg

scala> val idRegex(id) = "/xml/deliverables/images/23044.jpg"
id: String = 23044

至于 findFirstIn 方法 - 显然它 returns 正确的结果,无论正则表达式是否被锚定 - 根据定义,它可以扫描输入以寻找匹配项,并且不会' 要求整个输入匹配。