java - 替换占位符

像模版引擎一样,替换字符串中的 ${} 占位符,好处就是使用原生的API,不需要额外导包了。

public class A{

  private static final String BRACE_LEFT = "{";
    private static final String BRACE_RIGHT = "}";
    private static final String $ = "$";

    /**
     * 替换字符,占位符限定 ${}
     *
     * @param tmp    代码模版
     * @param params 参数
     * @return PreparedSql
     */
    public static String processMap(@NotNull String tmp, Map<String, ?> params) {
        StringTokenizer tokenizer = new StringTokenizer(tmp, "${}", true);
        StringBuilder res = new StringBuilder(tmp.length());
        String token;
        boolean escaped = false;
        while (tokenizer.hasMoreTokens()) {
            token = tokenizer.nextToken();
            if (escaped) {
                if ($.equals(token) || BRACE_LEFT.equals(token)) {
                    //占位符中出现美元符或者花括号
                    throw new IllegalArgumentException("Contain invalid char: " + token);
                } else if (BRACE_RIGHT.equals(token)) {
                    //标志复位
                    escaped = false;
                } else {
                    //参数名占位符
                    res.append(Converter.toString(params.get(token)));
                }
            } else {
                if ($.equals(token)) {
                    token = tokenizer.nextToken();
                    if (BRACE_LEFT.equals(token)) {
                        //检索到 '${' 开始尝试获取参数名
                        escaped = true;
                    } else {
                        //'$'独立出现的场景
                        res.append($).append(token);
                    }
                } else {
                    //普通字符
                    res.append(token);
                }
            }
        }
        return res.toString();
    }
}

posted on   疯狂的妞妞  阅读(218)  评论(0编辑  收藏  举报

(评论功能已被禁用)
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
历史上的今天:
2019-06-08 mysql - 交互式和非交互式
2018-06-08 java扫描包
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示