`

替换字符串中某些参数形成新的字符串

阅读更多
http://blog.csdn.net/preferme/article/details/5340793
package houlei.java.util;

import java.util.Map;
import java.lang.StringBuilder;

/**
 * <strong>可替换参数变量的字符串类。</strong>参数的形式为:${参数}<p/>
 * 例如:字符串 "This is a ${SomeThing}." 可替换的部分是:${SomeThing}。其中,SomeThing即为参数。<br/>
 * 如果要将${SomeThing}替换为字符串"Demo"(也就是说替换后的字符串是:"This is a Demo."),
 * 我们可以将SomeThing和Demo组成键值对放入Map中进行转换。<p/>
 * 代码示例:<br/>
 * <pre>{@code
 *   String demoStr = "This is a ${SomeThing}.";
 *   DynamicString ds = new DynamicString(demoStr);
 *   Map<String,String> param = new java.util.HashMap<String,String>(4);
 *   param.put("SomeThing", "Demo");
 *   System.out.println(ds.convert(param));
 * }</pre>
 * <strong>注意:反斜杠'/'是转义字符,活用可处理常见问题。</strong>
 * <P>该类创建于 2010-3-3 上午01:06:26
 * @version 1.0.0
 * @author 侯磊
 */
public class DynamicString {

	private String dynStr;
	private DynamicPattern header;
	private DynamicPattern tail;

	static abstract class DynamicPattern {
		DynamicPattern next;
		public abstract Object subConvert(Map<String,?> pattern);
	}

	static class StringPattern extends DynamicPattern {
		private String pattern;

		public StringPattern(StringBuilder buff, int start, int end) {
			this.pattern = buff.substring(start, end);
		}
		@Override
		public Object subConvert(Map<String,? extends Object> map) {
			return pattern;
		}
	}

	static class MappedPattern extends DynamicPattern {
		private String key;

		public MappedPattern(StringBuilder buff, int start, int end) {
			this.key = buff.substring(start, end);
		}
		@Override
		public Object subConvert(Map<String,? extends Object> param) {
			if(param.get(key)==null){
				throw new IllegalArgumentException("所传入的Map中,不含有参数:"+key);
			}
			return param.get(key);
		}
	}

	/**可替换参数变量的字符串类。该类适用于多个参数的情况。
	 * @param dynStr 模板字符串。
	 */
	public DynamicString(String dynStr) {
		this.dynStr = dynStr;
		init();
	}

	/**
	 * 生成中间模板,转义字符也要考虑在内。
	 */
	private void init() {
		header = tail = null;
		StringBuilder buff = new StringBuilder(dynStr);
		int start = 0, ptr = 0;
		boolean noMatching = true;
		for (ptr = start; ptr < buff.length(); ptr++) {
			if(buff.charAt(ptr)=='$' && buff.charAt(ptr+1)=='{'){
				if(ptr>0 && buff.charAt(ptr-1)=='//'){
					buff.deleteCharAt(ptr---1);
					if(ptr>1 && buff.charAt(ptr-1)=='//' && buff.charAt(ptr-2)=='//'){
						buff.deleteCharAt(ptr---1);continue;
					}
					if(!(ptr>0 && buff.charAt(ptr-1)=='//'))
					continue;
				}
				noMatching=false;
		        StringPattern sp = new StringPattern(buff, start, ptr);
		        appendPattern(sp);
		        start = ptr+2;
		        for (ptr += 2; ptr < buff.length(); ptr++) {
		        	if (buff.charAt(ptr) == '}') {
		        		if(buff.charAt(ptr-1)=='//'){
		        			buff.deleteCharAt(ptr---1);
		        			if(buff.charAt(ptr-1)!='//')
		        			continue;
		        		}
		        		MappedPattern mp = new MappedPattern(buff, start, ptr);
		        		appendPattern(mp);
		        		noMatching=true;
		        		start = ++ptr;break;
		        	}
		        }
			}
		}
		if (noMatching && ptr <= buff.length())
			appendPattern(new StringPattern(buff, start, ptr));
	}

	private DynamicString appendPattern(DynamicPattern pattern) {
		if (header == null) {
			header = pattern;
			tail = header;
		} else {
			tail.next = pattern;
			tail = pattern;
		}
		return this;
	}

	/**传入参数变量,得到替换后的结果。
	 * @param param 将替换的参数及变量以键值对的形式存放到Map对象中。
	 * @return  返回替换回的结果。
	 * @exception IllegalArgumentException 当待替换的参数不在Map对象中时,抛出该异常。
	 */
	public String convert(Map<String,? extends Object> param) {
		if (header == null)
			return null;
		DynamicPattern ptr = header;
		StringBuilder sb = new StringBuilder();
		while (ptr != null) {
			sb.append(ptr.subConvert(param));
			ptr = ptr.next;
		}
		return sb.toString();
	}

	/**
	 * @see #convert(Map)
	 */
	public String convert(String key,String value){
		Map<String,String> param = new java.util.HashMap<String,String>(2);
		param.put(key, value);
		return convert(param);
	}
}


真是相当有用啊
分享到:
评论

相关推荐

    c#文本替换命令行工具源码

    和f不能同时出现 &lt;br&gt;如: replace *.txt 查找字符串 替换字符串 如: replace setname 查找字符串 替换字符串 如: replace myinc/*.txt 查找字符串 替换字符串 /i 如: replace setname 查找字符串 替换...

    qsfuzz:qsfuzz(查询字符串模糊)允许您构建自己的规则来模糊查询字符串并轻松识别漏洞

    对于具有多个查询字符串的URL,一次执行一次qsfuzz注入,以确保在依赖某些参数的情况下不会中断请求。没有查询字符串的URL将被忽略。安装go get github.com/ameenmaali/qsfuzz用法qsfuzz从stdin中获取URL(带有查询...

    js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解

    JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数: unescape,decodeURI,decodeURIComponent 。 下面简单介绍一下它们的区别 1 escape()函数 定义和...

    Javascript中字符串replace方法的第二个参数探究

    当我们要把一段字符串中的某些指定字符替换掉,第一时间想到的就是replace方法,他的用法很简单,W3school上讲的清晰易懂。网上有关replace的文章也有很多了,那么这篇这里主要聊聊它的第二个参数,下面来一起看看,...

    extract-localization:从现有的标准 OS X 应用程序(如计算器)中提取本地化字符串的简单实用程序

    从现有的标准 OS X 应用程序(如计算器)中提取本地化字符串的简单实用程序。 要从/Application所有已安装的应用程序中提取字符串,只需像这样启动: java -jar extract-localization-VERSION.jar (用有效值替换...

    vim编辑器中熟练掌握正则表示法

    正则表示法透过一些特殊符号的辅助,可以让使用者轻易完成查找/删除/替换某些特定字符串的工作。 举例来说,如果只想找到MYweb(前面两个为大写字母)或 Myweb(仅有一个大写字母)字符串(MYWEB、myweb等都不符合...

    Exce百宝箱——2012版本.rar

    【计算表达式】:将表达式转换成值(包括从混合字符串中取出的表达式) &lt;══════════════════┤ 函数功能介绍 ├════════════════════&gt; 函数名称:sumifcol 函数功能与参数...

    命令行方式处理对文件的修改工具

    与DOS类似,可以用参数 /s 处理所有子目录中文件的替换工作 替换指定行的例子: change test.txt /from no /to re /lines 3-8 30-50 (即:只替换3到8行和30到50行的字符) 出于安全目的,该程序总要自动生成一个...

    Python Cookbook

    1.17 替换字符串中的子串-Python 2.4 34 1.18 一次完成多个替换 36 1.19 检查字符串中的结束标记 39 1.20 使用Unicode来处理国际化文本 40 1.21 在Unicode和普通字符串之间转换 43 1.22 在标准输出中打印...

    Excel百宝箱9.0无限制破解版.rar

    【计算表达式】:将表达式转换成值(包括从混合字符串中取出的表达式) &lt;══════════════════┤ 函数功能介绍 ├════════════════════&gt; 函数名称:sumifcol 函数功能与...

    入门学习Linux常用必会60个命令实例详解doc/txt

    -n:一般而言,mount挂上后会在/etc/mtab中写入一笔资料,在系统中没有可写入文件系统的情况下,可以用这个选项取消这个动作。 4.应用技巧 在Linux 和Unix系统上,所有文件都是作为一个大型树(以/为根)的一部分...

    EXCEL集成工具箱V6.0

    【取产品型号】 功能较在字符串中取数字强大多倍。能批量取某列存储格按指定长度的数字并允许特定数字串的获取,例如M76000,RC76000等。而小于指定长度的数字串则不予获取。 【快速选定数据】 可瞬间选中与用户指定...

    EXCEL集成工具箱V8.0完整增强版(精简)

    【取产品型号】 功能较在字符串中取数字强大多倍。能批量取某列存储格按指定长度的数字并允许特定数字串的获取,例如M76000,RC76000等。而小于指定长度的数字串则不予获取。 【快速选定数据】 可瞬间选中与用户指定...

    javascript 正则表达式触发函数进行高级替换

    [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行] 我们看到,当正则表达式每产生一次匹配时,会触发替换函数并将匹配字符串作为参数传到替换函数中。当正则表达式中定义了子匹配(submatch)时,甚至可以做更高级的...

    PHP-syntax-cheat

    str_replace('a','b', $string)用字符串中的b替换a trim($string)修剪前导和训练空间 explode($separator, $string)组成字符串数组,每个字符串都是使用分隔符提取的字符串参数的子字符串 implode($separator, $...

    xheditor-1.1.14

    参数值:字符串,例:url(test.gif) no-repeat,设置编辑器背景,格式同CSS同名参数一致。建议直接设置textarea的css背景 备注:v1.1.1新添加 loadCSS:加载样式 参数值:URL地址、URL数组以及直接内部样式,例如:'...

    正则表达式

    例如,序列 "\n" 在字符串中匹配的是一个直接量换行符.在正则表达式中,许多标点符号都有特殊的含义.下面是这些字符和它们的含义: 正则表达式的直接量字符 字符 匹配 ________________________________ 字母数字...

    javascript编码的几个方法详细介绍

    escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。 参数 描述 string 必需。要被转义或编码的字符串。   返回值 已编码的 string 的副本。其中某些字符被替换成了十六进制的转义序列...

    Excel百宝箱 9.0 破解版 批量导入图片等200种功能

    第一参数为引用,第二参数为待替换字符串,第三参数为新字符串,第四参数用于指定替换第几次出现的字符,范围在1到256之间 重复判断指定区域中是否有重复单元格的函数只有一个参数即为引用,结果为True时表示有重复...

    EXCEL百宝箱8.0终极版

    第一参数为引用,第二参数为待替换字符串,第三参数为新字符串,第四参数用于指定替换第几次出现的字符,范围在1到256之间。 函数名称:重复 函数功能与参数:判断指定区域中是否有重复单元格的函数只有一个参数即...

Global site tag (gtag.js) - Google Analytics