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"))
因此它会失败。 但是,有什么方法可以优雅地处理这个问题吗?
答案 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?