Java版占位符替换成参数

说明

  1. 占位符替换成参数值
    例如: (“{}好”, “你”) -> “你好”
  2. ${key} 替换成 key 对应的参数值
    例如:
    map.put(“谁”, “大家”);
    (“${谁}好”, map) -> “大家好”

代码如下

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

/**
 * @author Alvin 原创博客, 转载请注明出处
 * 如有不足之处, 请留言指出, 非常感谢.
 */
public class StrUtils {
    
    private static final Pattern PATTERN = Pattern.compile("\\$\\{(.*?)\\}");
    
    /**
     * 把字符串内容中的 {} 替换成 参数.
     *
     * @param content 字符串内容
     * @param params  参数
     */
    public static String format(String content, Object... params) {
        return formatByDelimit(content, "{}", params);
    }


    /**
     * 把字符串内容中的占位符替换成对应的值.
     *
     * @param content 字符串内容
     * @param delimit 占位符
     * @param params  参数值
     */
    public static String formatByDelimit(String content, String delimit, Object... params) {
        if (content == null) {
            return null;
        }
        if (delimit == null || delimit.length() < 1) {
            return content;
        }
        StringBuilder sb = new StringBuilder();
        int a = 0, b = 0;
        for (int n = 0; n < params.length && (b = content.indexOf(delimit, a)) > -1; n++, a = b + delimit.length()) {
            sb.append(content, a, b).append(params[n]);
        }
        if (a < content.length()) {
            sb.append(content, a, content.length());
        }
        return sb.toString();
    }


    /**
     * 把字符串内容中的 ${xx} 替换成 xx 对应的值.
     *
     * @param content 字符串内容
     * @param map     有 xx 做为 key 的 Map
     */
    public static String parse(String content, Map<String, String> map) {
        if (content == null) {
            return null;
        }
        if (map == null) {
            return content;
        }
        Matcher matcher = PATTERN.matcher(content);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            String value = map.get(matcher.group(1));
            if (value != null) {
                matcher.appendReplacement(sb, value);
            }
        }
        matcher.appendTail(sb);
        return sb.toString();
    }
    

    /**
     * 测试方法
     */
    public static void main(String[] args) {
        // 把 {} 替换成参数
        String format1 = format("{}爱{}{}, {}上{}升", "我", "北京", "天安门", "天安门", "太阳");
        String format2 = format("{}爱{}{}, {}上{}升{}{}", "我", "北京", "天安门", "天安门", "太阳");
        String format3 = format("{}爱{}{}, {}上{}升", "我", "北京", "天安门", "天安门", "太阳", "多余", "参数");
        System.out.println(format1);
        System.out.println(format2);
        System.out.println(format3);
        System.out.println("---------------------------------------");

        // 把 ${xx} 替换成 xx 对应的参数.
        String msg = "${谁}爱${哪}${什么}, ${什么}上${太阳}升";
        // xx 的对应关系.
        HashMap<String, String> kvs = new HashMap<>();
        kvs.put("谁", "我");
        kvs.put("哪", "北京");
        kvs.put("什么", "天安门");
        // 这里没有 "太阳" 对应的值.
        String parse = parse(msg, kvs);
        System.out.println(parse);
    }

测试方法打印如下

运行结果...

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值