"".replaceAll(String regex, String replacement);
需要将replacement中的$和//分别转换成
//$和
////, 不然会报错或得不到预期效果.
Test Cases:
1) System.out.println("name".replaceAll("name", "$name$"));
预期结果: $name$
实际结果: Exception in thread "main" java.lang.IllegalArgumentException: Illegal group reference
at java.util.regex.Matcher.appendReplacement(Matcher.java:706)
at java.util.regex.Matcher.replaceAll(Matcher.java:806)
at java.lang.String.replaceAll(String.java:2000)
at reflect.MailTemplate.main(MailTemplate.java:75)
at java.util.regex.Matcher.appendReplacement(Matcher.java:706)
at java.util.regex.Matcher.replaceAll(Matcher.java:806)
at java.lang.String.replaceAll(String.java:2000)
at reflect.MailTemplate.main(MailTemplate.java:75)
2) System.out.println("name".replaceAll("name", "
//name"));
预期结果: /name
实际结果: name
3) System.out.println("name".replaceAll("name", "name//"));
预期结果: name/
实际结果: Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 5
at java.lang.String.charAt(String.java:558)
at java.util.regex.Matcher.appendReplacement(Matcher.java:696)
at java.util.regex.Matcher.replaceAll(Matcher.java:806)
at java.lang.String.replaceAll(String.java:2000)
at reflect.MailTemplate.main(MailTemplate.java:75)
at java.lang.String.charAt(String.java:558)
at java.util.regex.Matcher.appendReplacement(Matcher.java:696)
at java.util.regex.Matcher.replaceAll(Matcher.java:806)
at java.lang.String.replaceAll(String.java:2000)
at reflect.MailTemplate.main(MailTemplate.java:75)
解决方法: 可以自己写个replaceAll方法, 例如:
private static String replaceAll(String str, String regex, String value){
return str.replaceAll(regex, value == null ? "" : value.replaceAll(" ////", " ////////").replaceAll("//$", " //////$"));
}
return str.replaceAll(regex, value == null ? "" : value.replaceAll(" ////", " ////////").replaceAll("//$", " //////$"));
}