一个简单的 ${} 占位符 表达式处理工具

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();
	}
	
}

  

posted @ 2022-12-07 16:41  RealWorld♂  阅读(51)  评论(0编辑  收藏  举报