zoukankan      html  css  js  c++  java
  • 【占位符替换】替换String中的占位符标志位{placeholder}

    概述

    占位符替换, 占位符表示为:{placeholder};

    示例:替换如下{xxx}占位符中的内容

    "名字:{name},年龄:{age},学校:{school}"
    

    提供了两种不同的替换方式:

    1. 使用Map对占位符的内容进行替换;
    2. 使用POJO对象,对占位符中的内容替换;

    代码

    import com.google.common.base.Strings;
    import com.google.common.collect.Sets;
    import org.springframework.util.CollectionUtils;
    import org.springframework.util.ObjectUtils;
    
    import java.beans.PropertyDescriptor;
    import java.lang.reflect.Method;
    import java.util.Map;
    import java.util.Set;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /**
     * Desc: 占位符替换, 占位符表示为:{@code {placeholder}};
     * <p>
     * 示例:替换如下{xxx}占位符中的内容
     * <pre>"名字:{name},年龄:{age},学校:{school}"</pre>
     */
    public class PlaceHolderReplaceUtils {
        private static final Pattern pattern = Pattern.compile("\{(.*?)\}");
        private static Matcher matcher;
    
        /**
         * 替换字符串占位符, 字符串中使用{key}表示占位符
         *
         * @param sourceString 需要匹配的字符串,示例:"名字:{name},年龄:{age},学校:{school}";
         * @param param        参数集,Map类型
         * @return
         */
        public static String replaceWithMap(String sourceString, Map<String, Object> param) {
            if (Strings.isNullOrEmpty(sourceString) || CollectionUtils.isEmpty(param)) {
                return sourceString;
            }
    
            String targetString = sourceString;
            matcher = pattern.matcher(sourceString);
            while (matcher.find()) {
                try {
                    String key = matcher.group();
                    String keyclone = key.substring(1, key.length() - 1).trim();
                    Object value = param.get(keyclone);
                    if (value != null) {
                        targetString = targetString.replace(key, value.toString());
                    }
                } catch (Exception e) {
                    throw new RuntimeException("String formatter failed", e);
                }
            }
            return targetString;
        }
    
        /**
         * 替换字符串占位符, 字符串中使用{key}表示占位符
         * <p>
         * 利用反射 自动获取对象属性值 (必须有get方法)
         *
         * @param sourceString 需要匹配的字符串
         * @param param        参数集
         * @return
         */
        public static String replaceWithObject(String sourceString, Object param) {
            if (Strings.isNullOrEmpty(sourceString) || ObjectUtils.isEmpty(param)) {
                return sourceString;
            }
    
            String targetString = sourceString;
    
            PropertyDescriptor pd;
            Method getMethod;
    
            // 匹配{}中间的内容 包括括号
            matcher = pattern.matcher(sourceString);
            while (matcher.find()) {
                String key = matcher.group();
                String holderName = key.substring(1, key.length() - 1).trim();
                try {
                    pd = new PropertyDescriptor(holderName, param.getClass());
                    getMethod = pd.getReadMethod(); // 获得get方法
                    Object value = getMethod.invoke(param);
                    if (value != null) {
                        targetString = targetString.replace(key, value.toString());
                    }
                } catch (Exception e) {
                    throw new RuntimeException("String formatter failed", e);
                }
            }
            return targetString;
        }
    
        /**
         * 查找String中的占位符keys;<br/>
         * 示例: "名字:{name},年龄:{age},学校:{school}", 则返回:Set[name,age,school]
         * <p>
         * pattern示例:
         * <pre> {@code
         *  // 尖括号:<placeHolder> 表示为占位符
         *  Pattern pattern = Pattern.compile("\<(.*?)\>");
         *
         *  // 大括号:{placeHolder} 表示为占位符, 上面的示例中就使用{}作为占位符
         *  Pattern pattern = Pattern.compile("\{(.*?)\}");
         * }
         * </pre>
         *
         * @param sourceString
         * @param pattern
         * @return
         */
        public static Set<String> findPlaceHolderKeys(String sourceString, Pattern pattern) {
            Set<String> placeHolderSet = Sets.newConcurrentHashSet();
    
            if (Strings.isNullOrEmpty(sourceString) || ObjectUtils.isEmpty(pattern)) {
                return placeHolderSet;
            }
    
            String targetString = sourceString;
            matcher = pattern.matcher(sourceString);
            while (matcher.find()) {
                String key = matcher.group();  //示例: {name}
                String placeHolder = key.substring(1, key.length() - 1).trim();  //示例: name
                placeHolderSet.add(placeHolder);
            }
    
            return placeHolderSet;
        }
    
    }
    
    

    测试代码

    package com.chinamobile.epic.regex;
    
    import com.google.common.collect.Maps;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import org.junit.Test;
    
    import java.util.Map;
    
    public class PlaceHolderReplaceUtilsTest {
        @Test
        public void replaceWithMap() throws Exception {
            String sourStr = "名字:{name},{name},年龄:{age},{school},学校:{school}";
            Map<String, Object> map = Maps.newHashMap();
            map.put("name", "Tom");
            map.put("age", 27);
            map.put("school", "Beijing");
            String tagerStr = PlaceHolderReplaceUtils.replaceWithMap(sourStr, map);
            System.out.println(tagerStr);
        }
    
        @Test
        public void replaceWithObject() throws Exception {
            String sourStr = "名字:{name},{name},年龄:{age},{school},学校:{school}";
            Person person = new Person("ZhangSan", "Suzhou", 45);
    
            String tagerStr = PlaceHolderReplaceUtils.replaceWithObject(sourStr, person);
            System.out.println(tagerStr);
        }
    
        @Data
        @AllArgsConstructor
        public static class Person {
            private String name;
            private String school;
            private int age;
        }
    
    }
    

    结果输出

    名字:ZhangSan,ZhangSan,年龄:45,Suzhou,学校:Suzhou
    名字:Tom,Tom,年龄:27,Beijing,学校:Beijing
    
  • 相关阅读:
    python接口自动化5-Json数据处理
    python接口自动化4-绕过验证码登录(cookie)
    python接口自动化2-发送post请求
    python接口自动化1-发送get请求
    python+selenium个人学习笔记11-登录封装与调用
    [jzoj]5257.小X的佛光
    [jzoj]1417.数学题
    2017.08.15【NOIP提高组】模拟赛B组
    [jzoj]1383.奇怪的问题
    [jzoj]1229.Hanoi
  • 原文地址:https://www.cnblogs.com/ssslinppp/p/7921541.html
Copyright © 2011-2022 走看看