You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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为例:

  1. 首先引入依赖(Gradle配置示例)
implementation 'org.antlr:ST4:4.3.4'
  1. 替换逻辑代码
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:15:03