2016-10-04 47 views
7

我已在在python以下幾點:如何獲得Scala中的匹配子組?

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

其中regex是一個正則表達式和string是一個充滿字符串。

所以我想在Scala中做同樣的事情,用regex.replaceAllIn(...)函數代替python sub。但是,我不知道如何獲得匹配的子組。

在Scala中是否有類似python函數group

回答

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 
2

您可以使用replaceAll,並使用$n,其中「n」是要匹配的組。例如:

yourString.replaceAll(yourRegex, "$1") 

用第一組替換匹配的零件。

+0

在案例中,你可以得到一個新的字符串捕獲所有組不是?就像我的例子一樣。最好的方法是什麼? – elbaulp

1

也許其他的方式做到這一點是有一個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將是:

"String Replaced: XXXXX, YYYYY"