Java开发中字符串的替换比较常用,一般情况下replaceAll方法可以满足需求,但是遇到一些特殊的情况,replaceAll方法并不能满足需求,如果使用Pattern与Matcher,使用Matcher中的find、group、appendReplacement和appendTail方法结合StringBuffer可以解决替换字符串中某些特殊的字符。
比如需要将字符串中的 - ( ) { } [ ] : 特殊字符前添加转义符\。 使用replaceAll方法不是很好处理,可以一个一个特殊字符处理,但是遇到特殊字符很多的情况,就没法处理了。使用appendReplacement处理的程序:
// 测试的字符串
String search = "[note]: This is the test {string} (1-1)";
// 正则表达式
Pattern pattern = Pattern.compile("[\\-\\(\\)\\{\\}\\[\\]\\:]");
// 获取正则表达式对应的Matcher对象
Matcher matcher = pattern.matcher(search);
// 创建StringBuffer缓存对象
StringBuffer stringBuffer = new StringBuffer();
// 通过matcher的find方法获取所有匹配的子串 (似于iterator迭代器的next)
while (matcher.find()) {
// 通过group获取匹配特殊的字符串
String name = matcher.group();
// 增加转义字符
name = "\\\\" + name;
// 将上次替换的位置到这次替换位置之间的字符串加上替换字符串一起追加到StringBuffer里
matcher.appendReplacement(stringBuffer, name);
}
// 把最后一次匹配到内容之后的字符串追加到StringBuffer中
matcher.appendTail(stringBuffer);
System.out.println(stringBuffer.toString());
appendReplacement方法:从上次替换的位置到这次替换位置之间的字符串加上替换字符串一起追加到StringBuffer里。
appendTail方法:把最后一次匹配到内容之后的字符串追加到StringBuffer中。
运行结果:
\[note\]\: This is the test \{string\} \(1\-1\)
使用Matcher中的find、group、appendReplacement和appendTail方法结合StringBuffer可以将指定的字符串按需求替换,项目中也有很多场景会用到。比如邮件模板、短信模板中变量的替换,静态Html页面中变量的替换等。