2016-10-04 14 views
7

Mam następujący w Pythonie:Jak mogę uzyskać podgrupy meczu w Scali?

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

gdzie regex jest wyrażeniem regularnym i string jest wypełniona String.

Więc próbuję zrobić to samo w Scala, używając funkcji regex.replaceAllIn(...) zamiast python sub. Jednak nie wiem, jak uzyskać odpowiednie podgrupy.

Czy jest coś podobnego do funkcji Pythona group w Scala?

Odpowiedz

3

scaladoc ma jeden przykład. Podaj funkcję z Match zamiast ciągu.

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 

Wynikowy ciąg również zastępuje grupę.

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

Możesz użyć replaceAll i użyć $n, gdzie "n" jest grupą, którą chcesz dopasować. Na przykład:

yourString.replaceAll(yourRegex, "$1") 

Zastępuje dopasowane części do pierwszej grupy.

+0

W przypadku przykładu, można uzyskać nowy ciąg przechwytywania wszystkich grup nie jest? Jak w moim przykładzie. Jakie byłoby najlepsze podejście? – elbaulp

1

Może inny sposób to zrobić jest posiadanie regex, na przykład:

val regExtractor = """a(b+)(c+)(d*)""".r 

A potem dopasować 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 będą:

"String Replaced: XXXXX, YYYYY" 
Powiązane problemy