Java实现${}进行匹配占位符并且替换数据工具类

Posted 张志翔 ̮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java实现${}进行匹配占位符并且替换数据工具类相关的知识,希望对你有一定的参考价值。

        PropertyUtils: 工具类使用了 commons-beanutils-1.8.2.jar 工具包进行获取数据源中数据

public class PlaceholderUtils 

    /** PLACEHOLDER_PATTERN */
    public static final Pattern PLACEHOLDER_PATTERN = Pattern.compile("\\\\$\\\\(.*?)\\\\");

    /**
     * 替换string中占位符
     *
     * @param model 具有占位符的字符串,可以是json格式
     * @param data  数据源
     * @return the string
     * @throws InvocationTargetException invocation target exception
     * @throws IllegalAccessException    illegal access exception
     * @throws NoSuchMethodException     no such method exception
     * @since 1.4.0
     */
    public static String process(String model, String data) throws InvocationTargetException,
                                                                   IllegalAccessException,
                                                                   NoSuchMethodException 
        // 匹配器
        Matcher matcher = PLACEHOLDER_PATTERN.matcher(model);
        //判断如果 匹配到了占位符并且 数据源为空时抛出异常
        boolean findReplace = matcher.find();
        if (!findReplace) 
            return model;
        
        //判断数据是否为空(自己封装的工具类,可以修改为自己业务代码中的异常判断)
        Assertions.notBlank(data, String.format("匹配到占位符,但数据源为空,不能进行数据转换:%s", model));
        // 处理匹配到的值
        return doProcess(matcher, JsonUtils.parse(data, Map.class));
    

    /**
     * 替换string中占位符
     *
     * @param model 具有占位符的字符串,可以是json格式
     * @param data  数据源
     * @return the string
     * @throws InvocationTargetException invocation target exception
     * @throws IllegalAccessException    illegal access exception
     * @throws NoSuchMethodException     no such method exception
     * @since 1.4.0
     */
    public static String process(String model, Map<String, Object> data) throws InvocationTargetException,
                                                                                IllegalAccessException,
                                                                                NoSuchMethodException 
        // 匹配器
        Matcher matcher = PLACEHOLDER_PATTERN.matcher(model);
        boolean findReplace = matcher.find();
        if (!findReplace) 
            return model;
        
       //判断数据是否为空(自己封装的工具类,可以修改为自己业务代码中的异常判断)
        Assertions.notBlank(data, String.format("匹配到占位符,但数据源为空,不能进行数据转换:%s", model));
        // 处理匹配到的值
        return doProcess(matcher, data);
    

    /**
     * Do process
     *
     * @param matcher matcher
     * @param data    data
     * @return the string
     * @throws IllegalAccessException    illegal access exception
     * @throws InvocationTargetException invocation target exception
     * @throws NoSuchMethodException     no such method exception
     * @since 1.4.0
     */
    @NotNull
    private static String doProcess(Matcher matcher, Object data) throws IllegalAccessException,
                                                                         InvocationTargetException,
                                                                         NoSuchMethodException 
        StringBuffer values = new StringBuffer();
        matcher.reset();
        while (matcher.find()) 
            String key = matcher.group(1);
            Object value = PropertyUtils.getProperty(data, key);
            Assertions.notNull(value, String.format("占位符未匹配到数据:%s", key));
            matcher.appendReplacement(values, JsonUtils.toJson(value));
        
        matcher.appendTail(values);
        return values.toString();
    
  

/**
     * 处理json转换时多余的双引号
     *
     * @param str str
     * @return string string
     * @since 1.4.0
     */
    public static String doProcessQuotes(String str) 
    //使用正则表达式匹配对应的数据
        Matcher matcher = PROCESS_QUOTES.matcher(str);
        StringBuffer values = new StringBuffer();
        while (matcher.find()) 
            String s = matcher.group().replace("\\\\", "");
            //截取出的格式为 :""color":"red1","temperature":217111,"guanji":2",需要将前后的双引号去掉
            StringBuilder strobe = new StringBuilder();
            for (int i = 0; i < s.length(); i++) 
                if (i == 1 || i == s.length() - 1) 
                    continue;
                
                strobe.append(s.charAt(i));
            
            matcher.appendReplacement(values, doProcessQuotes(strobe.toString()));
        
        //将后续的数据追加进去
        matcher.appendTail(values);
        return values.toString();
    

以上是关于Java实现${}进行匹配占位符并且替换数据工具类的主要内容,如果未能解决你的问题,请参考以下文章

配置文件或者模板中的占位符替换工具类

java中有啥方法可以读取占位符的字符串,并且把占位符替换成参数

Java实现JSON{参数}占位符名称替换指定的多个变量值

用动态数据替换占位符

替换 java 属性中占位符中的属性值 - IntelliJ 2017.2

spring源码解析---占位符解析替换