user2895589
user2895589

Reputation: 1030

Scala regex : capture between group

In below regex I need "test" as output but it gives complete string which matches the regex. How can I capture string between two groups?

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}

Upvotes: 1

Views: 146

Answers (1)

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 627488

You may capture that part using:

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

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

The pattern matches

  • \{outer\. - a literal {outer. substring
  • ([^{}]*) - Capturing group 1: zero or more (*) chars other than { and } (see [^{}] negated character class)
  • \} - a } char.

NOTE: if your regex must match the whole string, remove the .unanchored I added to also allow partial matches inside a string.

See the Scala demo online.

Or, you may change the pattern so that the first part is no longer as consuming pattern (it matches a string of fixed length, so it is possible):

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

See this Scala demo.

Here, (?<=\{outer\.), a positive lookbehind, matches {outer. but does not put it into the match value.

Upvotes: 3

Related Questions