如何以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
相关产品推荐
相关产品推荐

