package com.zbkj.common.utils; 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}}; *

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

"名字:{$name},年龄:{$age},学校:{$school}"
*/ public class PlaceHolderReplaceUtils { private static final Pattern pattern = Pattern.compile("\\{\\$(.*?)\\}"); private static Matcher matcher; public static String replaceWithMap(String sourceString, Map 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(2, 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; } 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(2, 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; } public static Set findPlaceHolderKeys(String sourceString, Pattern pattern) { Set 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(2, key.length() - 1).trim(); //示例: name placeHolderSet.add(placeHolder); } return placeHolderSet; } }