我想在斯卡拉實現一個Scala風格的字符串插值。下面是一個例子,在斯卡拉實現Scala風格的字符串插值
val str = "hello ${var1} world ${var2}"
在運行時,我想用一些運行時字符串替換「$ {var1}」和「$ {var2}」。然而,欲以Regex.replaceAllIn時(目標:CharSequence中,替代品:(比賽)⇒字符串),我遇到了以下問題:
import scala.util.matching.Regex
val placeholder = new Regex("""(\$\{\w+\})""")
placeholder.replaceAllIn(str, m => s"A${m.matched}B")
java.lang.IllegalArgumentException: No group with name {var1}
at java.util.regex.Matcher.appendReplacement(Matcher.java:800)
at scala.util.matching.Regex$Replacement$class.replace(Regex.scala:722)
at scala.util.matching.Regex$MatchIterator$$anon$1.replace(Regex.scala:700)
at scala.util.matching.Regex$$anonfun$replaceAllIn$1.apply(Regex.scala:410)
at scala.util.matching.Regex$$anonfun$replaceAllIn$1.apply(Regex.scala:410)
at scala.collection.Iterator$class.foreach(Iterator.scala:743)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1174)
at scala.util.matching.Regex.replaceAllIn(Regex.scala:410)
... 32 elided
然而,當我從正則表達式中刪除「$」,它的工作原理:
val placeholder = new Regex("""(\{\w+\})""")
placeholder.replaceAllIn(str, m => s"A${m.matched}B")
res2: String = hello $A{var1}B world $A{var2}B
所以我的問題是,這是否是在Scala正則表達式中的錯誤。如果是這樣,是否還有其他優雅的方式來實現相同的目標(除了殘酷的力量全部替換所有佔位符)?
是的,這正是問題所在。謝謝。 – 2014-11-04 22:31:51
對於那些對我所做的字符串插值有興趣的人。我有一個地圖,所有佔位符都可以替換。例如, VAL PARAMS =地圖( 「$ {VAR1}」 - > 「富」, 「$ {VAR2}」 - > 「欄」) 然後將下面的作品完美地串插 「」 「(\ $ \ {\ w + \})」「」。r.replaceAllIn(str,m => params.get(m.matched).getOrElse(「」)) – 2014-11-04 22:40:29