在下面的正则表达式中,我需要“ 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}
答案 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
以允许在字符串内进行部分匹配。
或者,您可以更改模式,以使第一部分不再是使用模式(它与固定长度的字符串匹配,因此可以):
val pattern = """(?<=\{outer\.)[^{}]*""".r
val s = "try {outer.test}"
println(pattern.findFirstIn(s).getOrElse(""))
// => test
请参见this Scala demo。
在这里,(?<=\{outer\.)
(正向后)与{outer.
匹配,但没有将其放入匹配值。