字符串替换参数一般是先解析出参数名字,然后替换掉,可以使用正则替换,也可以使用拼接字符串的方式替换,下面的代码代码演示了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,谢谢。
全文完。
相关推荐
将ubk_vhost_list表中的字段userid中的字符...表的名字 field_name —— 字段名 from_str —— 需要替换的字符串 to_str —— 替换成的字符串 今天运行了一个查询 UPDATE ubk_vhost_list SET userid = replace (use
`replaceAll`函数就是Java(也是Android)中处理字符串替换的一个重要方法。这个方法来自`String`类,允许我们用新的字符串替换掉原字符串中匹配某个模式的所有实例。在这个案例中,我们要关注的是如何替换字符串中...
字符串在作为参数传递时,是以引用传递的方式,这意味着对字符串的修改会影响到原始数据。 1. **字符串类型转换**: - 转换为`char`:通过索引器访问字符串中的特定字符,如`string[0]`。 - 转换为`char[]`:使用...
在软件开发中,字符串是极其重要的数据结构,尤其在与用户交互的过程中,如命令行参数、环境变量、控制台输入等。然而,字符串处理不当往往会导致严重的安全问题,比如缓冲区溢出、代码注入等。本章主要探讨了字符串...
在Shell脚本编程中,字符串比较是常见的操作。本文将详细阐述如何在Shell中检查两个字符串是否相等或不相等,并提供相应的示例代码。首先,我们需要了解Shell中的字符串处理基本规则,以及不同比较运算符的区别。 1...
- `str.replace(old, new[, count])`用于替换字符串中指定子串为新子串,可选参数`count`限制替换次数,如`a='hello world'`,`print(a.replace('world', 'Python'))`输出`hello Python`。 11. 格式化字符串: - ...
- 功能:将字符串中的某些子字符串替换为新的子字符串。 - 语法:`string.replace(old, new[, count])` - 参数: - `old`:旧的子字符串。 - `new`:新的子字符串。 - `count`:可选参数,指定替换的最大次数...
本文小结了多种PHP代码示例,用于截取中文字符串。首先提到的是一个针对GB2312编码的中文字符串截取函数mysubstr。这个函数通过遍历字符串,并使用ord函数判断字符的ASCII值是否大于0xa0(因为GB2312编码的中文字符...
本文对PHP字符串的常见用法进行小结,包括求字符串长度、截取字符串、计算单词数量、字符串转换与清理、以及字符串格式化等。 1. 求字符串长度 在PHP中,获取字符串长度是字符串操作中最基本的需求之一。使用strlen...
实验小结与心得部分,学生可能会提到通过实验,他们更深入地了解了字符串处理的重要性,掌握了Python中的字符串操作方法,并学会了如何使用正则表达式进行复杂的数据验证。他们可能也体验到了解决实际问题的乐趣,...
- 格式化字符串通常包含占位符,如"{0}",它们会被对应的参数替换。 - 格式规范可以指定数字的小数位数、日期格式、货币符号等。 - IFormatProvider接口用于提供特定的文化信息,IFormattable接口使得自定义类型...
总结来说,substring和substr方法是JavaScript中常用的字符串截取方法,它们简单易用,但在处理中文字符时需要注意编码的问题。通过正则表达式和字符串的组合使用,可以实现对中文字符串的有效截取。在实际开发中,...
在了解了JavaScript字符串对象的常用API函数之后,开发者可以更有效地处理字符串数据,无论是连接、替换、分割、转换大小写,还是提取子串等操作。这方面的知识对于进行Web开发尤为重要,因为处理用户输入、生成动态...
标题中提到的“JS字符串常用操作方法实例小结”指的是在JavaScript中处理字符串的一些基本而频繁使用的方法。字符串在编程中用于存储和表示文本信息,而JavaScript提供了多种方法来操作字符串,以便进行内容的提取、...
explode()函数接受两个参数:第一个参数是分隔符,第二个参数是要分割的字符串。它会返回一个数组,数组的每个元素是原字符串按分隔符拆分后的结果。例如,"Hello world"使用空格作为分隔符拆分后,可以得到数组[...
在上面的例子中,只有当输入的参数"world"与字符串中的"World"匹配时(不考虑大小写),才会返回匹配结果,否则返回null。 ```javascript var str = "Helloworld!"; document.write(str.match("world") + " ");...
另一个函数`strstr()`提供了返回子字符串第一次出现到主字符串末尾的子串功能,如果第三个参数为`true`,则返回子字符串之前的字符串部分。`stristr()`函数与`strstr()`相似,但其比较时不区分大小写。 获取子串...