如何在Scala中获取匹配的子组?

时间:2016-10-04 19:20:37

标签: python scala grouping

我在python中有以下内容:

  regex.sub(lambda t: t.group(1).replace(" ", "  ") + t.group(2),string)    

其中regex是正则表达式,string是填充字符串。

所以我试图在Scala中使用regex.replaceAllIn(...)函数而不是python sub来做同样的事情。但是,我不知道如何获得匹配的子组。

在Scala中是否有与python函数group类似的内容?

3 个答案:

答案 0 :(得分:3)

scaladoc有一个例子。提供Match而不是字符串的函数。

scala> val r = "a(b)(c)+".r
r: scala.util.matching.Regex = a(b)(c)+

scala> val s = "123 abcccc and abcc"
s: String = 123 abcccc and abcc

scala> r.replaceAllIn(s, m => s"a${m.group(1).toUpperCase}${m.group(2)*3}")
res0: String = 123 aBccc and aBccc

结果字符串也会进行组替换。

scala> val r = "a(b)(c+)".r
r: scala.util.matching.Regex = a(b)(c+)

scala> r.replaceAllIn(s, m => if (m.group(2).length > 3) "$1" else "$2")
res3: String = 123 b and cc

scala> r.replaceAllIn(s, m => s"$$${ if (m.group(2).length > 3) 1 else 2 }")
res4: String = 123 b and cc

答案 1 :(得分:2)

您可以使用replaceAll,并使用$n,其中“n”是您要匹配的群组。例如:

yourString.replaceAll(yourRegex, "$1")

将匹配的部分替换为第一组。

答案 2 :(得分:1)

也许其他方法可以使用distributionUrl=https\://services.gradle.org/distributions/gradle-2.12-bin.zip ,例如:

regex

然后匹配val regExtractor = """a(b+)(c+)(d*)""".r

String:

val string = "abbbbbbbbbccdd" val newString = string match { case regExtractor(g1, g2, g3) => s"""String Replaced: ${g1.replace(g1, "XXXXX")}, | ${g2.replace(g2, "YYYYY")}""".stripMargin } 将是:

newString