这段代码的作用是将字符串中${param}替换为map中的数据
private static String replaceVariantOldVersion(String str, Map<String,String> variantMap){ Matcher m = Pattern.compile("\\$\\{.*?\\}").matcher(str); StringBuffer rtn = new StringBuffer(); while(m.find()){ String foundStr = m.group(); String key = foundStr.substring("${".length(),foundStr.length()-1).trim(); String value = variantMap.get(key); if(null == value){ value = "{UNKNOWN_VALUE}"; } m.appendReplacement(rtn, value); } m.appendTail(rtn); return rtn.toString(); }
例如
String str = "my name is ${name}"; Map<String,String> map = new HashMap<String,String>(); map.put("name", "lazy"); System.out.println(replaceVariantOldVersion(str,map));//输出my name is lazy
但如果是
String str = "my name is ${name}"; Map<String,String> map = new HashMap<String,String>(); map.put("name", "$.lazy"); System.out.println(replaceVariantOldVersion(str,map));
则会抛出异常
Exception in thread "main" java.lang.IllegalArgumentException: Illegal group reference
at java.util.regex.Matcher.appendReplacement(Unknown Source)
at lgc.tools.struts2.ConventionUtil.replaceVariantOldVersion(ConventionUtil.java:241)
at lgc.tools.struts2.ConventionUtil.main(ConventionUtil.java:269)
public Matcher appendReplacement(StringBuffer sb, String replacement) { // If no match, return error if (first < 0) throw new IllegalStateException("No match available"); // Process substitution string to replace group references with groups int cursor = 0; String s = replacement; StringBuffer result = new StringBuffer(); while (cursor < replacement.length()) { char nextChar = replacement.charAt(cursor); if (nextChar == '\\') { cursor++; nextChar = replacement.charAt(cursor); result.append(nextChar); cursor++; } else if (nextChar == '$') { // Skip past $ cursor++; // The first number is always a group int refNum = (int)replacement.charAt(cursor) - '0'; if ((refNum < 0)||(refNum > 9)) throw new IllegalArgumentException( "Illegal group reference"); cursor++; // Capture the largest legal group string boolean done = false; while (!done) { if (cursor >= replacement.length()) { break; } int nextDigit = replacement.charAt(cursor) - '0'; if ((nextDigit < 0)||(nextDigit > 9)) { // not a number break; } int newRefNum = (refNum * 10) + nextDigit; if (groupCount() < newRefNum) { done = true; } else { refNum = newRefNum; cursor++; } } // Append group if (group(refNum) != null) result.append(group(refNum)); } else { result.append(nextChar); cursor++; } } // Append the intervening text sb.append(getSubSequence(lastAppendPosition, first)); // Append the match substitution sb.append(result.toString()); lastAppendPosition = last; return this; }
Matcher m = Pattern.compile("((\\d\\d)(\\w))").matcher("11a22b");
StringBuffer sb = new StringBuffer();
while(m.find()){
m.appendReplacement(sb, "$0,$1,$2,$3;");
}
m.appendTail(sb);
System.out.println(sb);
String str = "my name is ${name}"; Map<String,String> map = new HashMap<String,String>(); map.put("name", "\\.lazy"); System.out.println(replaceVariantOldVersion(str,map));
private static String replaceVariant(String str, Map<String,String> variantMap){ Matcher m = Pattern.compile("\\$\\{.*?\\}").matcher(str); StringBuffer rtn = new StringBuffer(); while(m.find()){ String foundStr = m.group(); String key = foundStr.substring("${".length(),foundStr.length()-1).trim(); String value = variantMap.get(key); if(null == value){ value = "{UNKNOWN_VALUE}"; } String valueReplacement = value.replaceAll("\\\\","\\\\\\\\").replaceAll("\\$", "\\\\\\$"); m.appendReplacement(rtn, valueReplacement); } m.appendTail(rtn); return rtn.toString(); }
public Matcher appendReplacement(StringBuffer sb, String replacement)
String s = "E:/mydir/mydir2/mdir3"; //System.out.println(s.replaceAll("/","\\"));报错 System.out.println(s.replaceAll("/","\\\\"));//正确