2017-01-24 6 views
0

스칼라 2.11.6스칼라

val fontColorMap = Map("Good" -> "#FFA500", "Bad" -> "#0000FF") 
val content = "Good or Bad?" 
"(Bad|Good)".r.replaceFirstIn(content,s"""<font color="${fontColorMap("$1")}">$$1</font>""") 

나는 정규식을 사용하여 문자열을 대체합니다. 이 경우 $$ 1은 일치하는 문자열을 가져올 수 있지만 $ {}에서 수행하는 방법을 알지 못합니다.

더하기. 나는 스칼라 따라서이 실패합니다이

new StringContext("""<font color=""",""">$$1</font>""").s(fontColorMap("$1")) 

처럼 무언가로 보간 번역 것이라는 점을 알고있다. 하지만 정상적으로 처리 할 수있는 방법이 있습니까?

답변

0

regex group variable 보간으로 인한 보간은 다른 보간 순서가 있습니다. 그리고 StringContextregex 보간으로 가기 전에 먼저 평가해야합니다. 어쩌면 우리는 같이, 먼저 regex replace interpolation 전에 값을 얻기 위해 시도 할 수 있습니다 : m 유형 scala.util.matching.Regex.Match이다

"(Bad|Good)".r.replaceAllIn(content, m => 
    s"""<font color="${fontColorMap(m.matched)}">${m.matched}</font>""" 
) 

:

"(Bad|Good)".r.findFirstIn(content).map(key => { 
    val value = fontColorMap(key) 
    content.replaceFirst(key, s"""<font color="$value">$key</font>""") 
}).get 
> <font color="#FFA500">Good</font> or Bad? 
+0

예, 마침내이 문제를 해결하기 위해 사용합니다. – luchy0120

1

당신은 기능을한다 replaceAllIn의 버전을 사용할 수 있습니다.

같은 일을하는 replaceFirstIn의 버전이없는 것 같습니다.

+0

나는 이것이 OP의 의미라고 생각합니다. –

+0

네, 처음 것만 바꾸고 싶습니다. – luchy0120