用stringbuilder实现简易模板引擎,遍历字符串识别${key}占位符,从map取值替换;支持容错(缺key保留原占位符),不支持嵌套,通过indexof定位、逆序拼接避免索引偏移。

用 StringBuilder 实现简易模板引擎,核心是遍历字符串、识别占位符(如 ${key})、按键从数据源中取值并替换。它不依赖外部库,适合轻量、可控的场景,但不处理嵌套、条件或循环。
定义占位符格式与解析逻辑
约定占位符为 ${xxx} 形式,避免和普通花括号冲突。需扫描字符串,找到所有 ${ 开始、} 结束的片段,提取中间的 key(去空格、忽略大小写可选)。
- 用
indexOf和lastIndexOf定位起止位置,避免正则开销 - 注意嵌套占位符不支持(如
${a${b}}),遇到内层${直接跳过或报错 - 推荐先收集所有占位符位置,再逆序替换,防止索引偏移
用 StringBuilder 逐段构建结果
不直接调用 String.replace,而是用 StringBuilder 拼接:把原字符串按占位符切分成若干段,对每段判断是否为占位符,是则查 map 取值,否则原样追加。
- 初始化
StringBuilder result = new StringBuilder() - 维护游标
int start = 0,每次找到一个${...}就追加substring(start, begin)+ 替换值,再更新start = end + 1 - 循环结束后补上末尾剩余内容:
result.append(template.substring(start))
提供简单数据源与容错机制
数据源通常用 Map<string string></string>,key 对应占位符名,value 为要插入的文本。关键是要处理缺失 key 的情况:
- 默认保留原始占位符(如
${missing}不变),便于调试 - 也可设为静默忽略(替换为空字符串)或抛异常,取决于业务需求
- 建议对 key 做 trim,避免前后空格导致匹配失败
封装成可复用的方法示例
以下是一个简洁可用的静态方法:
public static String render(String template, Map<string string> data) {
if (template == null || data == null) return template;
StringBuilder sb = new StringBuilder();
int start = 0, len = template.length();
while (start
</string>
调用方式:render("Hello ${name}! Today is ${day}.", Map.of("name", "Alice", "day", "Monday")) → "Hello Alice! Today is Monday."
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











