我写了一个读取文本文件的代码。文本文件包含我要替换的占位符。替换无法以这种方式工作,并且字符串将使用占位符打印。这是我为此编写的代码:
class TestSub(val sub: Sub) {
fun create() = template()
fun template() = Files.newBufferedReader(ClassPathResource(templateId.location).file.toPath()).readText()
}
data class Sub(val name: String, val age: Int)
这是尝试打印最终字符串的主要功能:
fun main(args: Array<String>) {
val sub = Sub("Prashant", 32)
println(TestSub(sub).create())
}
但是,当我使用字符串而不是读取文件时,以下代码有效(替换fun template()
)
fun template() = "<h1>Hello ${sub.name}. Your age is ${sub.age}</h1>"
读取文件内容时是否有办法使字符串替换工作?
答案 0 :(得分:3)
Kotlin不支持文件中的字符串模板。即像"some variable: $variable"
这样的 code 会被编译为"some variable: " + variable
。字符串模板是在编译时处理的,这意味着它不适用于从文件加载的文本,或者如果您执行其他操作以使字符串转义为原始格式,则该模板将不起作用。无论哪种方式,正如danielspaniol所述,这都是安全威胁。
留下三个选项:
String.format(str)
MessageFormat.format(str)
我不知道您的文件包含什么,但是如果它是您在模板函数中使用的String,请将其更改为:
<h1>Hello {0}. Your age is {1,integer}</h1>
这是给MessageFormat
的,这是我个人的偏爱。如果使用String.format
,请改用%s
和其他适当的格式。
现在,在MessageFormat.format
中使用它:
val result = MessageFormat.format(theString, name, age);
请注意,如果您使用MessageFormat
,则需要将'
转换为''
。参见this。
答案 1 :(得分:1)
使用${...}
进行字符串替换是字符串文字语法的一部分,并且大致像这样
val a = 1
val b = "abc ${a} def" // gets translated to something like val b = "abc " + a + " def"
因此,当您从文本文件加载时,此方法将无法工作。这也将带来巨大的安全风险,因为它将允许任意代码执行。
但是我认为Kotlin具有类似sprintf
的功能,您可以在字符串中使用类似%s
的占位符,并可以将其替换为值
看看here。看起来最简单的方法是使用String.format
答案 2 :(得分:0)
字符串模板仅适用于编译时Sting文字,而您从文件中读取的内容则在运行时生成。
您需要一个模板引擎,该引擎可以在运行时呈现带有变量或模型的模板。
在简单的情况下,Java中的String.format
或MessageFormat.format
可以使用。
对于复杂的情况,请检查胸腺叶,速度等。