当前位置: 首页 > news >正文

字符串模板匹配

为什么80%的码农都做不了架构师?>>>   hot3.png

 

package com.adam;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StringTemplateParser {
	private String pstartTag = "${";
	private String pendTag = "}";
	/**
	 * 
	 * @param template 要解析的字符串
	 * @param map 对应的值
	 * @return  返回解析结果
	 */
	public String parse(String template,Map<String,String> map){
		StringBuffer temp = new StringBuffer(template);
		Map<String,String> tagMap = this.getTagIndex(template);
			for(Map.Entry<String, String> entry:tagMap.entrySet()){
				//获得标识符
				String tag = entry.getValue();
				//获得替换的值,如果没有,则不变
				String repVal = map.get(entry.getKey())==null?entry.getValue():map.get(entry.getKey());
				//获得标识符在字符串中出现的次数
				int index = 0;
				//判断同一个标识符在字符串中出现的次数
				while((index=template.indexOf(tag,index))!=-1){
					//替换
					//System.out.println(tag+"位置:"+index);
					temp = temp.replace(temp.indexOf(tag), temp.indexOf(tag)+tag.length(), repVal);
					index += tag.length(); 
				}
			}
			return temp.toString();		
	}
	/**
	 * 获得key和对应的标识符如{age=${age}, name=${name}}
	 * @param template
	 * @return 
	 */
	protected Map<String,String> getTagIndex(String template){
		Map<String,String> map = new HashMap<String,String>();
		Pattern pattern = Pattern.compile("\\$\\{[\\w]+\\}") ;
		Matcher matcher = pattern.matcher(template);
		int pstartLen = pstartTag.length();
		while(matcher.find()){
			//获得标示符
			String tag = matcher.group();
			//获得key
			String key = tag.substring(pstartLen, tag.lastIndexOf(pendTag));
			map.put(key, tag);
		}
		return map;
	}
	
	
	public static void main(String[] args) {
		String template = "${age} hi,${name},${name} are you ${age}?";
		Map<String, String> map = new HashMap<String, String>();
		map.put("name", "adam");
		map.put("age", "25");
		StringTemplateParser stp = new StringTemplateParser();
		System.out.println(stp.parse(template,map));
		System.out.println(stp.getTagIndex(template));
	}
}

转载于:https://my.oschina.net/mkm/blog/78430

相关文章:

  • linux Perforce 使用
  • Android Activity生命周期
  • 敏捷结果30天之第十一天:高效能、慢生活
  • C++:复制构造函数在什么时候被调用?
  • js模拟hashtable
  • 取消锚(a/)点击后页面跳转的几种方法
  • 程序员面试题100题第26题——和为n连续正数序列
  • 软考 (一) 感触
  • 第二十三模板 15模板和友元
  • Android之loader
  • 第六天之还得接着采集
  • Emacs的haskell-mode的安装
  • 网络时间协议 --- 网络对时程序
  • Cocoa、Foundation、UIKit的概念
  • 想象你在镜子前,请问,为什么镜子中的影像可以颠倒左右,却不能颠倒上下?...
  • 「面试题」如何实现一个圣杯布局?
  • es6
  • Java 网络编程(2):UDP 的使用
  • Python_OOP
  • Ruby 2.x 源代码分析:扩展 概述
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • session共享问题解决方案
  • swift基础之_对象 实例方法 对象方法。
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 浮动相关
  • 前端面试之CSS3新特性
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 驱动程序原理
  • 删除表内多余的重复数据
  • 阿里云ACE认证学习知识点梳理
  • 交换综合实验一
  • ​学习一下,什么是预包装食品?​
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #Z2294. 打印树的直径
  • (1)Nginx简介和安装教程
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (6)STL算法之转换
  • (超详细)语音信号处理之特征提取
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (五)Python 垃圾回收机制
  • (一一四)第九章编程练习
  • .axf 转化 .bin文件 的方法
  • .NET CLR Hosting 简介
  • .netcore 获取appsettings
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • [ C++ ] STL---仿函数与priority_queue
  • [autojs]autojs开关按钮的简单使用
  • [BZOJ] 2427: [HAOI2010]软件安装
  • [CentOs7]图形界面
  • [Docker]十二.Docker consul集群搭建、微服务部署,Consul集群+Swarm集群部署微服务实战
  • [java/jdbc]插入数据时获取自增长主键的值
  • [leetcode top100] 0924 找到数组中消失的数,合并二叉树,比特位计数,汉明距离
  • [LeetCode] 2.两数相加