import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 一个简单的 ${} 占位符 表达式处理工具 * * @author * @since: v1.0 */ public class SimpleElUtils { /** * ${} 的正则表达式 */ private final static String VAR_REGEX = "\\$\\{(.+?)\\}"; /** * $XX 的正则表达式 */ private final static String VAR_REGEX2 = "\\$(\\w+)"; /** * 缓存正则表达式编译器 */ public final static Pattern VAR_PATTERN = Pattern.compile(VAR_REGEX); public final static Pattern VAR_PATTERN_2 = Pattern.compile(VAR_REGEX2); /** * 对字符串中存在的 ${}变量,使用实际的值 进行替换。 * * 使用例子参考 : * * template = http://${ip}:${port}/show?name=${name} * * datas = { "ip":"192.168.11.137", "port":"8080", "name":"admin"} * * parseTemplate( template, datas ) --> http://192.168.11.137:8080/show?name=admin * * * @param template --- 这是带有 ${} 变量的字符串数据 * @param datas --- <变量名称,值> 的映射表,每个 template 中所使用到的变量,都需要一个对应值。变量名不要带 $和{,}这样的定界符 * @return */ public static String parseTemplate(String template, Map<String, String> datas) { return parseTemplate(template, datas, VAR_PATTERN); } /** * 使用由外部给出的 正则表达式来替换 * * @param template * @param datas * @param p * @return */ public static String parseTemplate(String template, Map<String, String> datas, Pattern p) { if(StringUtils.isNullOrEmpty(template)){ return template; } Matcher matcher = p.matcher(template); StringBuffer result = new StringBuffer(); while(matcher.find()){ String var = matcher.group(1); String value = datas.get(var); if(value == null){ value = ""; } matcher.appendReplacement(result, value); } matcher.appendTail(result); return result.toString(); } /** * 默认使用 ${} 作为占位符 * * @param template * @param callback * @return */ public static String parseTemplate(String template, final Callbackable<String, String> callback) { return parseTemplate(template, callback, VAR_PATTERN); } /** * 不提供 Map<String, String> 方式替换变量,而是为外部提供一个回调的方法,让外部灵活处理 * * @param template * @param callback * @param p 由外部提供占位符抽取表达式 * @return */ public static String parseTemplate(String template, final Callbackable<String, String> callback, Pattern p) { if(StringUtils.stringIsEmpty(template)){ return template; } Matcher matcher = p.matcher(template); StringBuffer result = new StringBuffer(); while(matcher.find()){ String var = matcher.group(1); String value = null; if(callback != null){ value = callback.doWith(var); } if(value == null){ value = ""; } matcher.appendReplacement(result, value); } matcher.appendTail(result); return result.toString(); } }
标签:return,String,matcher,param,占位,value,template,工具,表达式 From: https://www.cnblogs.com/RealWorld/p/16963550.html