Scala正则表达式:组之间的捕获

时间:2019-02-13 18:11:09

标签: regex scala

在下面的正则表达式中,我需要“ test”作为输出,但它给出了与正则表达式匹配的完整字符串。如何捕获两组之间的字符串?

val pattern = """\{outer.*\}""".r

 println(pattern.findAllIn(s"try {outer.test}").matchData.map(step => step.group(0)).toList.mkString)



Input : "try {outer.test}" 
expected Output : test 
current output : {outer.test}

1 个答案:

答案 0 :(得分:3)

您可以使用以下方法捕获该部分:

val pattern = """\{outer\.([^{}]*)\}""".r.unanchored
val s = "try {outer.test}"

val result = s match {
  case pattern(i) => i
  case _ => ""
}
println(result)

模式匹配

  • \{outer\.-文字{outer.子字符串
  • ([^{}]*)-捕获组1:除*{以外的零个或多个(})字符(请参见[^{}]否定字符类)
  • \}-一个}字符。

注意:如果您的正则表达式必须与整个字符串匹配,请删除我添加的.unanchored以允许在字符串内进行部分匹配。

请参见Scala demo online

或者,您可以更改模式,以使第一部分不再是使用模式(它与固定长度的字符串匹配,因此可以):

val pattern = """(?<=\{outer\.)[^{}]*""".r
val s = "try {outer.test}"
println(pattern.findFirstIn(s).getOrElse(""))
// => test

请参见this Scala demo

在这里,(?<=\{outer\.)(正向后)与{outer.匹配,但没有将其放入匹配值。