scala使用字符串插值进行字符串替换

时间:2017-01-24 05:22:11

标签: string scala string-interpolation

scala 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>""")

我想用正则表达式替换String。在这种情况下 $$ 1可以获取匹配的字符串,但我不知道如何在$ {}中执行此操作。

加。我知道scala会转换插值 这样的事情

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

因此它会失败。 但是,有什么方法可以优雅地处理这个问题吗?

2 个答案:

答案 0 :(得分:1)

您可以使用带有函数的replaceAllIn版本:

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

其中m的类型为scala.util.matching.Regex.Match

虽然似乎不是replaceFirstIn的一个版本,但却做同样的事情。

答案 1 :(得分:0)

似乎是由regex group variable插值引起的scala StringContext插值具有不同的插值顺序。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?