`
53873039oycg
  • 浏览: 841780 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

[简单]字符串替换参数小结

    博客分类:
  • java
 
阅读更多

        字符串替换参数一般是先解析出参数名字,然后替换掉,可以使用正则替换,也可以使用拼接字符串的方式替换,下面的代码代码演示了2种情况下如何替换参数,一种是参数名称含前缀和后缀如${key},另一种情况是只含前缀,使用空格作为后缀,如:key,代码如下

       

package com.huse.strtest;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Set;

public class 字符串替换参数小结_S4_Test {
	public static void main(String[] args) throws Exception {
		字符串替换参数小结_S4_Test t = new 字符串替换参数小结_S4_Test();
		String str = "$ { name},${name },$ {${order}} ${${$}";
		String beforSplit = "${";
		String afterSplit = "}";
		Map<String, String> context = new HashMap<String, String>();
		context.put("name", "测试\\${");
		context.put("order", "测试值\\$1");
		context.put("${$", "测试值\\$2");
		System.out.println("#-------------测试有前缀有后缀------------------#");
		System.out.println("采用正则拿到${key}后替换:");
		System.out.println(t.replaceAllStrByRegNormal(str, beforSplit,afterSplit, context));
		System.out.println("采用字符串查找先取到所有key再直接replaceAll");
		System.out.println(t.replaceAllStrByReg(str, beforSplit, afterSplit,context));
		System.out.println("使用StringBuffer拼接替换字符串后的结果,采用subString得到${key}后替换");
		System.out.println(t.replaceAllStrByAppendStr(str, beforSplit,afterSplit, context));
		System.out.println("#-------------测试有前缀空格后缀------------------#");
		String str2 = "A: :A 测试:A :B C :D :E :F F: in( :m ,:l";
		context.put("A", "测试$:");
		context.put("B", "测试$2");
		context.put("D", "测试$3");
		context.put("F", "测试\\$4");
		context.put("l", "测试5");
		beforSplit = ":";
		System.out.println("采用正则拿到:key后替换");
		System.out.println(t.replaceAllStrByRegNormal2(str2, beforSplit, context));
		System.out.println("采用字符串查找先取到所有key再直接replaceAll");
		System.out.println(t.replaceAllStrByReg2(str2, beforSplit,context));
		System.out.println("使用StringBuffer拼接替换字符串后的结果,采用subString得到${key}后替换");
		System.out.println(t.replaceAllStrByAppendStr2(str2, beforSplit,context));
	}

	/**
	 * @Description 采用正则拿到${key}后替换
	 */
	public String replaceAllStrByRegNormal(String str, String beforSplit,
			String afterSplit, Map<String, String> paramData) throws Exception {
		// 参数校验
		if (paramData == null || paramData.size() == 0) {
			return str;
		}
		if (isEmptyStr(str)) {
			return null;
		}
		if (isEmptyStr(beforSplit)) {
			beforSplit = "${";
		}
		if (isEmptyStr(afterSplit)) {
			afterSplit = "}";
		}
		//不匹配时候原样输出
		String tmpBeforSplit = beforSplit, tmpAfterSplit = afterSplit;
		beforSplit = beforSplit.replaceAll("\\$", "\\\\\\$");
		beforSplit = beforSplit.replaceAll("\\{", "\\\\\\{");
		afterSplit = afterSplit.replaceAll("\\$", "\\\\\\$");
		afterSplit = afterSplit.replaceAll("\\{", "\\\\\\{");
		String regex = beforSplit + "(.+?)" + afterSplit;
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(str);
		StringBuffer sb = new StringBuffer();
		while (matcher.find()) {
			String key = matcher.group(1);// 键名
			String value = (String) paramData.get(trimStr(key));// 键值
			if (value == null) {
				value = tmpBeforSplit + key + tmpAfterSplit;// 如果不想保留不匹配值则value=""
			}
			value = java.util.regex.Matcher.quoteReplacement(value);
			matcher.appendReplacement(sb, value);
		}
		matcher.appendTail(sb);
		return sb.toString();
	}

	/**
	 * @Description 采用字符串查找先取到所有key再直接replaceAll ${key}
	 */
	public String replaceAllStrByReg(String str, String beforSplit,
			String afterSplit, Map<String, String> context) {
		// 参数校验
		if (context == null || context.size() == 0) {
			return str;
		}
		if (isEmptyStr(str)) {
			return null;
		}
		if (isEmptyStr(beforSplit)) {
			beforSplit = "${";
		}
		if (isEmptyStr(afterSplit)) {
			afterSplit = "}";
		}
		Map<String, String> resultMap = safetyProcessMapValue(context);
		Set<String> paramNames = getParamNames(str, beforSplit, afterSplit);
		for (String name : paramNames) {
			Object obj = resultMap.get(trimStr(name));
			if (obj != null) {
				String regex = "\\Q" + beforSplit + name + afterSplit + "\\E";
				str = str.replaceAll(regex, obj.toString());
			}
		}
		return str;
	}

	/**
	 * @Description 根据分割符从字符串中取得变量的名字
	 */
	public Set<String> getParamNames(String str, String beforeSplit,
			String afterSplit) {
		Set<String> paramNames = new HashSet<String>();
		int start = 0, end = 0;
		while (end < str.length()) {
			start = str.indexOf(beforeSplit, end);
			if (start == -1) {
				break;
			}
			start = start + beforeSplit.length();
			end = str.indexOf(afterSplit, start);
			if (end == -1) {
				break;
			}
			String param = str.substring(start, end);
			paramNames.add(param);
			end = end + afterSplit.length();
		}
		return paramNames;
	}

	/**
	 * @Description: 使用StringBuffer拼接替换字符串后的结果,采用subString得到${key}替换 适用于key
	 *               2侧都有值
	 */
	public String replaceAllStrByAppendStr(final String str, String beforSplit,
			String afterSplit, Map<String, String> map) {
		if (map == null || map.size() == 0) {
			return str;
		}
		if (isEmptyStr(str)) {
			return null;
		}
		if (isEmptyStr(beforSplit)) {
			beforSplit = "${";
		}
		if (isEmptyStr(afterSplit)) {
			afterSplit = "}";
		}
		StringBuilder sb = new StringBuilder((int) (str.length() * 1.5));
		int cursor = 0;
		for (int start, end; (start = str.indexOf(beforSplit, cursor)) != -1
				&& (end = str.indexOf(afterSplit, start)) != -1;) {
			sb.append(str.substring(cursor, start));
			String key = str.substring(start + beforSplit.length(), end);
			if (map.get(trimStr(key)) != null) {
				sb.append(map.get(trimStr(key)));
			} else {
				sb.append(beforSplit).append(key).append(afterSplit);
			}
			cursor = end + 1;
		}
		sb.append(str.substring(cursor, str.length()));
		return sb.toString();
	}

	/**
	 * @Description 采用正则拿到:key后替换
	 */
	public String replaceAllStrByRegNormal2(String str, String beforSplit,
			Map<String, String> paramData) throws Exception {
		// 参数校验
		if (paramData == null || paramData.size() == 0) {
			return str;
		}
		if (isEmptyStr(str)) {
			return null;
		}
		if (isEmptyStr(beforSplit)) {
			beforSplit = ":";
		}
		beforSplit = beforSplit.replaceAll("\\$", "\\\\\\$");
		beforSplit = beforSplit.replaceAll("\\{", "\\\\\\{");
		String regex = beforSplit + "([^\\s]+?)" + "(\\s+|$)";
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(str);
		StringBuffer sb = new StringBuffer();
		while (matcher.find()) {
			String key = matcher.group(1);// 键名
			String value = (String) paramData.get(trimStr(key));// 键值
			if (value == null) {
				value = matcher.group(0);
			} else {
				value = value + " ";
			}
			value = java.util.regex.Matcher.quoteReplacement(value);
			matcher.appendReplacement(sb, value);
		}
		matcher.appendTail(sb);
		return sb.toString();
	}

	/**
	 * @Description 拿到所有:key后replaceAll
	 */
	public String replaceAllStrByReg2(String str, String beforSplit,
			Map<String, String> context) {
		// 参数校验
		if (context == null || context.size() == 0) {
			return str;
		}
		if (isEmptyStr(str)) {
			return null;
		}
		if (isEmptyStr(beforSplit)) {
			beforSplit = ":";
		}
		Map<String, String> resultMap = safetyProcessMapValue(context);
		Set<String> paramNames = getParamNames2(str, beforSplit);
		for (String name : paramNames) {
			Object obj = resultMap.get(trimStr(name));
			if (obj != null) {
				String regex = "\\Q" + beforSplit + name + "\\E";
				str = str.replaceAll(regex, obj.toString());
			}
		}
		return str;
	}

	public Set<String> getParamNames2(String str, String beforeSplit) {
		Set<String> paramNames = new HashSet<String>();
		int start = 0, end = 0;
		while (end < str.length()) {
			start = str.indexOf(beforeSplit, end);
			if (start == -1) {
				break;
			}
			start = start + beforeSplit.length();
			end = str.indexOf(" ", start);
			if (end == -1) {
				end = str.lastIndexOf(beforeSplit);
				if (end != start-beforeSplit.length()) {
					break;
				}
				end = str.length();
			}
			String param = str.substring(start, end);
			paramNames.add(param);
			end = end + " ".length();
		}
		return paramNames;
	}

	/**
	 * @Description StringBuilder 拼接
	 */
	public String replaceAllStrByAppendStr2(final String str,
			String beforSplit, Map<String, String> map) {
		if (map == null || map.size() == 0) {
			return str;
		}
		if (isEmptyStr(str)) {
			return null;
		}
		if (isEmptyStr(beforSplit)) {
			beforSplit = ":";
		}
		StringBuilder sb = new StringBuilder((int) (str.length() * 1.5));
		int cursor = 0;
		for (int start, end; (start = str.indexOf(beforSplit, cursor)) != -1;) {
			end = str.indexOf(" ", start);
			if (end == -1) {
				if ((end=str.lastIndexOf(beforSplit)) != start) {
					break;
				} else {
					end = str.length();
				}
			}
			sb.append(str.substring(cursor, start));
			String key = str.substring(start + beforSplit.length(), end);
			if (map.get(trimStr(key)) != null) {
				sb.append(map.get(trimStr(key))).append(" ");
			} else {
				sb.append(beforSplit).append(key).append(" ");
			}
			cursor = end + 1;
		}
		if(cursor<=str.length()){
			sb.append(str.substring(cursor, str.length()));
		}
		return sb.toString();
	}

	public String trimStr(final String str) {
		return str == null ? null : str.trim();
	}

	public boolean isEmptyStr(String str) {
		return str == null || str.trim().length() == 0;
	}

	// 对特殊字符进行处理如$
	public Map<String, String> safetyProcessMapValue(Map<String, String> map) {
		Map<String, String> resultMap = new HashMap<String, String>();
		for (Entry<String, String> entry : map.entrySet()) {
			resultMap.put(entry.getKey(),
					java.util.regex.Matcher.quoteReplacement(entry.getValue()));
		}
		return resultMap;
	}

}

   结果为:

  

#-------------测试有前缀有后缀------------------#
采用正则拿到${key}后替换:
$ { name},测试\${,$ {测试值\$1} 测试值\$2
采用字符串查找先取到所有key再直接replaceAll
$ { name},测试\${,$ {测试值\$1} 测试值\$2
使用StringBuffer拼接替换字符串后的结果,采用subString得到${key}后替换
$ { name},测试\${,$ {测试值\$1} 测试值\$2
#-------------测试有前缀空格后缀------------------#
采用正则拿到:key后替换
A: 测试$: 测试测试$: 测试$2 C 测试$3 :E 测试\$4 F: in( :m ,测试5 
采用字符串查找先取到所有key再直接replaceAll
A: 测试$: 测试测试$: 测试$2 C 测试$3 :E 测试\$4 F: in( :m ,测试5
使用StringBuffer拼接替换字符串后的结果,采用subString得到${key}后替换
A: 测试$: 测试测试$: 测试$2 C 测试$3 :E 测试\$4 F: in( :m ,测试5 

     转载请注明原处,原链接http://53873039oycg.iteye.com/blog/2144339,谢谢。

     全文完

 

0
0
分享到:
评论

相关推荐

    mysql查询字符串替换语句小结(数据库字符串替换)

    将ubk_vhost_list表中的字段userid中的字符...表的名字 field_name —— 字段名 from_str —— 需要替换的字符串 to_str —— 替换成的字符串 今天运行了一个查询 UPDATE ubk_vhost_list SET userid = replace (use

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

    `replaceAll`函数就是Java(也是Android)中处理字符串替换的一个重要方法。这个方法来自`String`类,允许我们用新的字符串替换掉原字符串中匹配某个模式的所有实例。在这个案例中,我们要关注的是如何替换字符串中...

    绝对有用:字符串常用处理小结积累

    字符串在作为参数传递时,是以引用传递的方式,这意味着对字符串的修改会影响到原始数据。 1. **字符串类型转换**: - 转换为`char`:通过索引器访问字符串中的特定字符,如`string[0]`。 - 转换为`char[]`:使用...

    第2章字符串[整理].pdf

    在软件开发中,字符串是极其重要的数据结构,尤其在与用户交互的过程中,如命令行参数、环境变量、控制台输入等。然而,字符串处理不当往往会导致严重的安全问题,比如缓冲区溢出、代码注入等。本章主要探讨了字符串...

    Shell字符串比较相等、不相等方法小结

    在Shell脚本编程中,字符串比较是常见的操作。本文将详细阐述如何在Shell中检查两个字符串是否相等或不相等,并提供相应的示例代码。首先,我们需要了解Shell中的字符串处理基本规则,以及不同比较运算符的区别。 1...

    python字符串的常用操作方法小结

    - `str.replace(old, new[, count])`用于替换字符串中指定子串为新子串,可选参数`count`限制替换次数,如`a='hello world'`,`print(a.replace('world', 'Python'))`输出`hello Python`。 11. 格式化字符串: - ...

    Python字符串的常见操作实例小结

    - 功能:将字符串中的某些子字符串替换为新的子字符串。 - 语法:`string.replace(old, new[, count])` - 参数: - `old`:旧的子字符串。 - `new`:新的子字符串。 - `count`:可选参数,指定替换的最大次数...

    php中截取中文字符串的代码小结

    本文小结了多种PHP代码示例,用于截取中文字符串。首先提到的是一个针对GB2312编码的中文字符串截取函数mysubstr。这个函数通过遍历字符串,并使用ord函数判断字符的ASCII值是否大于0xa0(因为GB2312编码的中文字符...

    php的字符串用法小结

    本文对PHP字符串的常见用法进行小结,包括求字符串长度、截取字符串、计算单词数量、字符串转换与清理、以及字符串格式化等。 1. 求字符串长度 在PHP中,获取字符串长度是字符串操作中最基本的需求之一。使用strlen...

    实验三:字符串处理.doc

    实验小结与心得部分,学生可能会提到通过实验,他们更深入地了解了字符串处理的重要性,掌握了Python中的字符串操作方法,并学会了如何使用正则表达式进行复杂的数据验证。他们可能也体验到了解决实际问题的乐趣,...

    无私分享(C#高级编程第6版):第08章字符串和正则表达式[收集].pdf

    - 格式化字符串通常包含占位符,如"{0}",它们会被对应的参数替换。 - 格式规范可以指定数字的小数位数、日期格式、货币符号等。 - IFormatProvider接口用于提供特定的文化信息,IFormattable接口使得自定义类型...

    javascript截取字符串小结

    总结来说,substring和substr方法是JavaScript中常用的字符串截取方法,它们简单易用,但在处理中文字符时需要注意编码的问题。通过正则表达式和字符串的组合使用,可以实现对中文字符串的有效截取。在实际开发中,...

    javascript字符串对象常用api函数小结(连接,替换,分割,转换等)

    在了解了JavaScript字符串对象的常用API函数之后,开发者可以更有效地处理字符串数据,无论是连接、替换、分割、转换大小写,还是提取子串等操作。这方面的知识对于进行Web开发尤为重要,因为处理用户输入、生成动态...

    JS字符串常用操作方法实例小结

    标题中提到的“JS字符串常用操作方法实例小结”指的是在JavaScript中处理字符串的一些基本而频繁使用的方法。字符串在编程中用于存储和表示文本信息,而JavaScript提供了多种方法来操作字符串,以便进行内容的提取、...

    php字符串操作常见问题小结

    explode()函数接受两个参数:第一个参数是分隔符,第二个参数是要分割的字符串。它会返回一个数组,数组的每个元素是原字符串按分隔符拆分后的结果。例如,"Hello world"使用空格作为分隔符拆分后,可以得到数组[...

    JavaScript 字符串处理函数使用小结

    在上面的例子中,只有当输入的参数"world"与字符串中的"World"匹配时(不考虑大小写),才会返回匹配结果,否则返回null。 ```javascript var str = "Helloworld!"; document.write(str.match("world") + " ");...

    PHP常用字符串函数小结(推荐)

    另一个函数`strstr()`提供了返回子字符串第一次出现到主字符串末尾的子串功能,如果第三个参数为`true`,则返回子字符串之前的字符串部分。`stristr()`函数与`strstr()`相似,但其比较时不区分大小写。 获取子串...

Global site tag (gtag.js) - Google Analytics