为什么在尝试获取此捕获组时会出现 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 正确的结果,无论正则表达式是否被锚定 - 根据定义,它可以扫描输入以寻找匹配项,并且不会' 要求整个输入匹配。
我有一个正则表达式问题。这是一个正则表达式,用于从 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 正确的结果,无论正则表达式是否被锚定 - 根据定义,它可以扫描输入以寻找匹配项,并且不会' 要求整个输入匹配。