2017-01-24 2 views
0

scala 2.11.6scala String-Interpolation für string Ersatz

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

mit möchte ich den String mit Regex ersetzen. In diesem Fall $$ 1 kann die übereinstimmende Zeichenfolge abrufen, aber ich weiß nicht, wie es in $ {} zu tun.

plus. Ich weiß, dass scala die Interpolation in so etwas wie diese

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

übersetzt So wird es scheitern. Aber, gibt es einen Weg, wie ich das anmutig behandeln kann?

Antwort

0

Scheint verursacht durch regex group variable Interpolation mit scala StringContext Interpolation hat die unterschiedliche Interpolationsreihenfolge.Und StringContext müssen zuerst ausgewertet werden, bevor Sie auf die regex Interpolation gehen. Vielleicht können wir Wert versuchen zunächst zu erhalten, bevor regex replace interpolation, wie:

"(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

Ja, endlich benutze ich das um – luchy0120

1

Sie können die Version von replaceAllIn verwenden, die eine Funktion übernimmt: scala.util.matching.Regex.Match

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

wo m ist vom Typ.

Es scheint keine Version von replaceFirstIn zu geben, die das Gleiche tut.

+0

zu arbeiten Ich denke, das ist, was OP bedeutet. –

+0

Ja, ich möchte nur die erste ersetzen – luchy0120