`

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

 
阅读更多
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);
	}
}


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

相关推荐

    Android relaceALL替换字符串中的反斜杠

    这个方法来自`String`类,允许我们用新的字符串替换掉原字符串中匹配某个模式的所有实例。在这个案例中,我们要关注的是如何替换字符串中的反斜杠字符`\`。 ### 1. `replaceAll`函数介绍 `replaceAll`函数的基本...

    逐个替换字符串中的指定字符

    其中,“替换”是常见且非常有用的操作之一,它允许我们修改字符串中的某些部分。例如,在网页开发中,可能需要将用户输入中的某些字符转换为HTML实体,或者在文本处理应用中,需要替换文本中的特定词汇。 ### 二、...

    js替换字符串

    - `replace()`方法用于替换字符串中的匹配项。 - 第一个参数可以是字符串或正则表达式,表示要查找的模式。 - 第二个参数是要替换成的新内容。 3. **条件判断与逻辑控制**: 通过`if`语句根据不同的条件执行相应的...

    C#中怎样从指定字符串中查找并替换字符串?

    在C#编程中,查找和替换字符串是常见的操作,尤其在处理文本数据时。下面将详细介绍如何在C#中实现这一功能。 首先,C#提供了`System.String`类,它包含许多方法来处理字符串,包括查找和替换。例如,我们可以使用`...

    字符串查找替换(超经典)

    替换操作则涉及将字符串中的某个或某些特定子字符串替换成另一个字符串。在Python中,可以使用`str.replace()`方法;在Java中,可以使用`String.replace()`或`String.replaceAll()`;而在C++中,可以使用`std::...

    替换文件字符串 utf8 unicode ansi

    4. **文件替换字符串操作**:在程序开发中,替换文件中的字符串是一项常见的任务。这通常涉及到读取文件、处理文本内容(替换特定字符串)、然后将修改后的内容写回文件。为了处理不同编码的文件,需要使用相应的...

    一次查找替换文本中多个字符串

    程序会遍历指定的文本文件,对每一个匹配到的旧字符串进行替换,将其更新为新的字符串。同时,为了确保不破坏原始数据,这个工具可能提供了备份原文件的功能,这样即使发生意外,也能恢复到修改前的状态。 此外,...

    去掉字符串中的某一字符

    - `Replace()` 方法可以用于替换字符串中的某个或某些字符/子字符串。 #### 4.2 使用 `Where()` 和 `Aggregate()` 方法 - 如果想要更高级一点的处理方式,可以使用 LINQ(Language Integrated Query)中的 `Where()...

    纯C++ 字符串处理函数大全源码

    2. `ReplaceAll`:在字符串中查找并替换特定子串,这在需要批量替换某些特定内容时非常方便。 3. `Join`:将一个字符串向量合并为一个单一的字符串,可以指定连接两个字符串的字符。 4. `ToLower`/`ToUpper`:将字符...

    Javascript中字符串相关常用的使用方法总结

    - `replace(searchValue, replaceValue)` 方法用于替换字符串中的某些字符。 ```javascript console.log(str.replace('h', 'H')); // 输出Hello,world ``` 7. **转换字符串大小写** - `toUpperCase()` 和 `...

    postgresql数字结尾字符串分割排序说明

    为了实现这一排序需求,可以通过编写两个自定义函数来完成:`subnamenum`用于提取字符串中的数字部分,`subnamestr`用于提取字符串中的非数字部分。接着,在查询语句中使用这两个函数来进行排序。 #### 自定义函数...

    过滤字符串中的HTML标签

    ### 过滤字符串中的HTML标签 在Web开发和文本处理领域中,经常需要对包含HTML(HyperText Markup Language)标签的字符串进行清洗,以便只保留其中的纯文本内容。这通常是为了提高数据的安全性、可读性和易于处理。...

    JavaScript截取中文字符串

    3. **累加长度并构建新字符串**:遍历原始字符串中的每个字符,根据其类型更新`newLength`,并将字符加入到`newStr`中。 4. **添加省略号**:如果`hasDot`参数为真且原始字符串长度大于指定长度,则在截取后的字符串...

    js使用split函数按照多个字符对字符串进行分割的方法

    在JavaScript中,正则表达式是一种特殊的字符串模式,可以用来匹配、查找或替换字符串中的字符组合。在split()函数中使用正则表达式作为分隔符,可以实现对字符串的多重分割。具体来说,我们可以在正则表达式中列出...

    C#中字符串的格式化及转换成数值的方法

    在处理字符串时,我们经常需要替换字符串中的某些部分。C#提供了多种方法来实现这一点,包括`string.Replace`方法和正则表达式的`Regex.Replace`方法。 **示例:** 1. 使用`string.Replace`方法: ```csharp ...

    PHP 获取字符串中的字符

    这两个函数用于查找字符串中的子字符串位置。`strpos()`从开始查找,`strrpos()`从后向前查找。返回的是子字符串的第一个字符相对于字符串开始的位置,如果未找到则返回`false`。 ```php $str = "查找字符串中的...

    php 替换敏感字符串类

    2. **白名单替换**:类中可能会有一个方法如 `whitelistReplace()`,用于检查并替换字符串中的非白名单字符。白名单是指允许出现的字符集合,任何不在集合内的字符都将被替换为预设的字符或字符串。 3. **黑名单替换...

    linux 字符串操作

    #### 二、获取字符串中的某些字符 获取字符串中的特定字符或子字符串的方法有很多。 1. **使用 `tr -cd` 和 `wc -c`:** ```bash $ echo $var | tr -cd 'g' | wc -c 2 ``` 此命令组合用于统计字符串中出现的...

    JavaScript利用正则表达式替换字符串中的内容

    本文将深入探讨如何利用正则表达式在字符串中替换特定内容。 首先,我们来看一下基本的字符串替换操作。在JavaScript中,我们可以使用`String.prototype.replace()`方法来替换字符串中的某个模式。这个方法接受两个...

    模板字符串 - JavaScript _ MDN.pdf

    标签函数的第一个参数是一个字符串数组,包含了所有模板字符串中的静态部分,后续的参数则是模板字符串中每个表达式的值。例如: ```javascript function tag(strings, ...values) { console.log(strings[0]); // ...

Global site tag (gtag.js) - Google Analytics