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

如何以HashMap为变量源在字符串中插值替换指定格式变量

Java字符串变量插值:替换$$variable;格式的变量

刚好之前做项目时遇到过一模一样的需求——不用提前知道变量名,自动把字符串里所有$$variable;格式的占位符替换成HashMap对应的值,下面给你两种实用方案,兼顾原生无依赖和简洁高效:

方案一:原生Java正则实现(无第三方依赖)

用正则表达式匹配所有$$xxx;格式的占位符,配合Matcher的appendReplacement方法逐次替换,这是纯Java环境下最直接高效的方式,一次遍历就能完成所有替换:

import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class VariableInterpolator {
    public static void main(String[] args) {
        String text = "Hello my name is $$name; and my surname is $$surname;";
        HashMap<String, String> variables = new HashMap<>();
        variables.put("name", "John");
        variables.put("surname", "Doe");

        // 正则匹配$$xxx;,分组捕获变量名xxx
        Pattern pattern = Pattern.compile("\\$\\$(\\w+);");
        Matcher matcher = pattern.matcher(text);
        StringBuffer result = new StringBuffer();

        while (matcher.find()) {
            // 获取捕获的变量名
            String varName = matcher.group(1);
            // 从map中取对应值,若不存在则保留原占位符(也可以换成""空字符串)
            String replacement = variables.getOrDefault(varName, matcher.group());
            // 替换并追加到结果中,quoteReplacement避免替换值里的特殊字符干扰
            matcher.appendReplacement(result, Matcher.quoteReplacement(replacement));
        }
        // 追加剩余未匹配的部分
        matcher.appendTail(result);

        System.out.println(result.toString());
        // 输出:Hello my name is John and my surname is Doe
    }
}

关键点说明:

  • 正则\\$\\$(\\w+);:转义$(因为$是正则特殊字符),用分组(\\w+)捕获变量名(如果变量名包含特殊字符,可改成([^;]+)匹配到分号前的所有内容)
  • Matcher.quoteReplacement(replacement):确保替换值里的$、\等特殊字符不会被当成正则语法处理,避免出错
  • 缺失变量处理:用getOrDefault可以选择保留原占位符或者替换为空,按需调整即可

方案二:用Apache Commons Text简化代码(推荐,高效简洁)

如果项目允许引入第三方依赖,Apache Commons Text的StrSubstitutor专门做这种变量替换,底层已经做了性能优化,代码量极少:

第一步:引入依赖(Maven为例)

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-text</artifactId>
    <version>1.10.0</version> <!-- 替换为最新稳定版即可 -->
</dependency>

第二步:一行代码完成替换

import org.apache.commons.text.StrSubstitutor;
import java.util.HashMap;

public class VariableInterpolator {
    public static void main(String[] args) {
        String text = "Hello my name is $$name; and my surname is $$surname;";
        HashMap<String, String> variables = new HashMap<>();
        variables.put("name", "John");
        variables.put("surname", "Doe");

        // 自定义占位符前缀为$$,后缀为;
        StrSubstitutor substitutor = new StrSubstitutor(variables, "$$", ";");
        String result = substitutor.replace(text);

        System.out.println(result);
        // 输出:Hello my name is John and my surname is Doe
    }
}

优势:

  • 代码极度简洁,无需自己写正则和循环逻辑
  • 内置处理各种边界情况(比如变量缺失、特殊字符转义)
  • 底层实现高效,多次替换场景下性能表现优异

关于“最快替换方式”的说明

如果追求极致性能,原生正则的appendReplacement方式和StrSubstitutor的效率相差不大——两者都是一次遍历字符串完成所有替换。纯Java环境选方案一,有依赖权限选方案二更省心。

内容的提问来源于stack exchange,提问作者MischievousChild

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 07:24:07