scala.MatchError 将带有可选部分的字符串分成一个或三个部分时

scala.MatchError when partitioning a string with an optional part into one or three parts

我正在尝试拉出这样的东西:

params = {"path", "contentName"}

下面parametersStr的一部分

@RequestMapping(value = "/breezeQuery", params = {"path", "contentName"}, method = RequestMethod.GET)

为什么这段代码给我 scala.MatchError?:

val paramsPattern = """(.*)(?:params = \{.*})?(.*)""".r
val paramsPattern(left, paramsStr, right) = parametersStr

此外,字符串中可能不会出现这样的模式。所以我也想知道是不是这样。最后,我捕获了组左侧和右侧的所有内容,以便我可以连接它们以从字符串中删除捕获的组。它是可选的,但如果它存在,我确实想捕获它。

我相信您想将字符串分成 3 或 2 个部分(取决于可选 params = \{.*})。

您可以使用

^(.*?)(?:(params\s*=\s*\{.*?})(.*))?$

regex demo详情

  • ^ - 字符串开头
  • (.*?) - 第 1 组():
  • (?:(params\s*=\s*\{.*?})(.*))? - 可选的非捕获组,将至少尝试一次:
    • (params\s*=\s*\{.*?}) - 第 2 组(paramsStr):params 字,= 包含 0+ 个空格,{ ,除换行符以外的任何零个或多个字符,尽可能少,然后 }
    • (.*) - 第 3 组:除换行字符外的任何零个或多个字符,尽可能多
  • $ - 字符串结尾

Scala demo:

val parametersStr = """@RequestMapping(value = "/breezeQuery", params = {"path", "contentName"}, method = RequestMethod.GET)"""
val paramsPattern = """^(.*?)(?:(params\s*=\s*\{.*?})(.*))?$""".r
val paramsPattern(left, paramsStr, right) = parametersStr
println(s"Left: $left\nParam String: $paramsStr\nRight: $right")

输出:

Left: @RequestMapping(value = "/breezeQuery", 
Param String: params = {"path", "contentName"}
Right: , method = RequestMethod.GET)