在实际开发中,我们经常需要处理不同格式的占位符,如{userName}、#{userName}或@{userName}等。本文将介绍如何扩展原有的模板替换方案,使其能够灵活处理多种占位符格式。
问题分析:多种占位符格式的挑战
原方案只能处理{key}格式的占位符,但实际场景中常遇到不同格式:
-
配置文件中使用
#{key} -
SQL模板中使用
@{key} -
国际化资源中使用
%{key} -
日志模板中使用
${key}
我们需要一个灵活的解决方案,能够同时处理这些不同格式的占位符。
增强版解决方案:支持多种占位符格式
public static String render(String template, Map<String, String> data) {
// 匹配 {key}, #{key}, @{key}, ${key} 等多种格式
Pattern pattern = Pattern.compile("([#@$%]?)\\{([^}]+)\\}");
Matcher matcher = pattern.matcher(template);
StringBuffer buffer = new StringBuffer();
while (matcher.find()) {
String prefix = matcher.group(1); // 捕获前缀
String key = matcher.group(2); // 捕获实际键名
// 如果数据中存在键值,则替换;否则保留原占位符
String replacement = data.containsKey(key)
? data.get(key)
: prefix + "{" + key + "}";
// 处理特殊字符转义
matcher.appendReplacement(buffer, Matcher.quoteReplacement(replacement));
}
matcher.appendTail(buffer);
return buffer.toString();
}
完整使用示例
public static void main(String[] args) {
Map<String, String> data = new HashMap<>();
data.put("userName", "张三");
data.put("code", "888888");
String template1 = "你好,{userName} 验证码:{code}";
String template2 = "系统通知:#{userName},您的验证码是@{code}";
String template3 = "错误:${errorCode},消息:%{message}";
System.out.println(render(template1, data));
// 输出:你好,张三 验证码:888888
System.out.println(render(template2, data));
// 输出:系统通知:张三,您的验证码是888888
System.out.println(render(template3, data));
// 输出:错误:${errorCode},消息:%{message}
}
高级扩展:支持自定义占位符格式
public static String render(String template, Map<String, String> data, String prefixPattern) {
// 构建自定义正则:prefixPattern + "{key}"
String regex = "(" + prefixPattern + ")?\\{([^}]+)\\}";
Pattern pattern = Pattern.compile(regex);
// 其余逻辑相同...
}
// 使用示例:只支持@和$前缀
String result = render(template, data, "[@$]");
293

被折叠的 条评论
为什么被折叠?



