2016-10-04 16 views
7

Tôi đã sau trong python:Làm thế nào tôi có thể nhận được các nhóm con của trận đấu ở Scala?

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

nơi regex là một Regular Expression và string là một String điền.

Vì vậy, tôi đang cố gắng làm tương tự trong Scala, sử dụng hàm regex.replaceAllIn(...) thay vì python sub. Tuy nhiên, tôi không biết làm thế nào để có được các nhóm con phù hợp.

Có điều gì tương tự với hàm python group trong Scala không?

Trả lời

3

Các scaladoc có một ví dụ. Cung cấp hàm từ Match thay vì một chuỗi.

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 

Chuỗi kết quả cũng thay thế nhóm.

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

Bạn có thể sử dụng replaceAll và sử dụng $n, trong đó "n" là nhóm bạn muốn đối sánh. Ví dụ:

yourString.replaceAll(yourRegex, "$1") 

Thay thế các phần phù hợp với nhóm thứ nhất.

+0

Với ví dụ điển hình, bạn có thể nhận được Chuỗi bắt giữ tất cả các nhóm mới không? Giống như trong ví dụ của tôi. Cách tiếp cận tốt nhất là gì? – elbaulp

1

cách Có lẽ khác để làm điều này là có một regex, ví dụ:

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

Và sau đó kết hợp các 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 sẽ là:

"String Replaced: XXXXX, YYYYY" 
Các vấn đề liên quan