首页 > 其他分享 >一个简单的 ${} 占位符 表达式处理工具

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

时间:2022-12-07 16:58:41浏览次数:27  
标签:return String matcher param 占位 value template 工具 表达式

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

相关文章

  • 幕布平替工具markmap
    幕布能够用写大纲笔记的方式来实现思维导图,但是被字节收购后功能合并到了飞书文档里面,已经不再更新了闲逛的时候发现了一个平替工具:markmap它可以用写markdown的方式来实......
  • 可以快速批量查询域名是否被QQ拦截的工具,如何查询域名域名QQ安全状态?
    相信很多做站的朋友都遇到过域名被拦截的情况,如果不小心买到被拦截的域名,将会严重影响网站的收录情况,那有没有什么方法可以快速查询域名是否被QQ拦截呢?最近在使用iis7站长工......
  • ipv6正则表达式
    ^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]......
  • 大数据数仓体系中如何玩转各种开源工具或技术
    在从离线到实时化发展的过程中,大数据领域出现了很多优秀的系统以应对各种不同的分析和查询场景。1.比如我们可以将实时的数据归档到像Hive这样的离线数仓里进行数据的离线......
  • CADD工具及流程编排解决方案
    CADD过程简述:新基因靶标发现:将疾病分解为若干阶段,分析关键因子,确定发病机制和相关分子靶标验证:在疾病模型中,当靶标上的特定作用显示出良好效果是,就可以确定靶标新靶标......
  • 软件项目管理工具 PingCode 入选2022年度企服口碑产品TOP36——36氪
    11月30日,由36氪企服点评主办的年度口碑产品与标杆解决方案正式发布。在本次评选中PingCode&Worktile双双入选,并且 PingCode 凭借产品好评度与用户覆盖度优势成为唯一......
  • lambda表达式
    接口类只有一个抽象方法,才可以使用lambda表达式packagecom.lambda;publicclasslambdaTest{publicstaticvoidmain(String[]args){//向上转型实现接......
  • PS---套索工具del键删除不了【解决方案】
    最近在用PS进行一些抠图操作,遇到一个奇怪的问题,就是使用套索工具来选择后,按删除键,删除不了点,或者是在删除点后,就无法再次选中的问题。万万没想到这个是微软输入法的问题:wi......
  • JAVA8 函数式编程(1)- Lambda表达式
    aliases:[JAVALambda]tags:"#Java"summary:[如何使用函数式编程写出优雅高效的JAVA代码]author:[yaenli]date:[2022-11-10]1简介简洁的代码就能处......
  • Java—Google guava工具类(高效)快速入门指南
    Java—Googleguava工具类(高效)快速入门指南Googleguava工具类特点Guava是对JavaAPI的补充,对Java开发中常用功能进行更优雅的实现,使得编码更加轻松,代码容易理解。Guava......