Kotlin是否有eval类功能可实现外部模板文件的变量插值替换?
实现方案
方案1:轻量正则替换(适合仅替换简单$变量场景)
无第三方依赖,直接使用Kotlin标准库实现,性能优异,大文件处理效率高,完全对齐原有envsubst的基础能力:
import java.io.File fun main() { // 1. 读取外部模板文件内容 val templateContent = File("你的模板文件路径").readText() // 2. 预先定义需要替换的变量映射,新增变量直接在该Map中添加即可 val variables = mapOf( "World" to "地球", "User" to "张三" ) // 3. 正则匹配$开头的变量,支持$$转义为普通$ val regex = "\\$([a-zA-Z0-9_]+)|\\$\\$".toRegex() val result = regex.replace(templateContent) { matchResult -> when { // 匹配到$$转义,返回单个$ matchResult.value == "$$" -> "$" // 匹配到变量则从映射取值,未匹配到可保留原占位符或抛异常,可按需调整 else -> variables[matchResult.groupValues[1]] ?: matchResult.value } } // 输出或保存替换后的结果 println(result) }
方案2:引入模板引擎(适合复杂业务场景)
如果后续需要支持条件判断、循环、嵌套变量等复杂逻辑,可以使用轻量模板引擎,以原生支持$格式占位符的StringTemplate为例:
- 首先引入依赖(Gradle配置示例)
implementation 'org.antlr:ST4:4.3.4'
- 替换逻辑代码
import org.stringtemplate.v4.ST import java.io.File fun main() { val templateContent = File("你的模板文件路径").readText() // 指定占位符的前后边界都是$ val st = ST(templateContent, '$', '$') st.add("World", "地球") st.add("User", "张三") val result = st.render() println(result) }
注意事项
- 大文件处理:如果是GB级别的超大模板,不要用
readText一次性读入内存,改成按行读取逐行替换后写入输出文件即可,避免OOM - 变量合法性校验:可以在替换前加校验逻辑,检查模板中所有占位符是否都在变量映射里存在,避免漏替换
- 特殊字符转义:如果模板中需要输出原义的
$字符,上述两种方案都默认支持$$转义为单个$的规则
内容的提问来源于stack exchange,提问作者Frischling
相关产品推荐
相关产品推荐

