2017-01-24 96 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可以獲取匹配的字符串,但我不知道如何在$ {}中執行此操作。

plus。我知道,斯卡拉將插值 翻譯弄成這個樣子

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

因此它會失敗。 但是,有什麼辦法可以妥善處理?

回答

0

好像被regex group variable插補scala StringContext插值引起了不同的插值order.And StringContext需要評估之前,首先去的regex插值。也許我們可以嘗試regex replace interpolation前首先獲得價值,如:

"(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版本,需要一個功能:

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

其中mscala.util.matching.Regex.Match類型。

儘管如此,似乎沒有replaceFirstIn的版本。

+0

我認爲這就是OP的意思。 –

+0

是的,我只想替換第一個 – luchy0120