多种占位符格式的Java字符串模板替换

在实际开发中,我们经常需要处理不同格式的占位符,如{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, "[@$]");

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值