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