appendTail(StringBuffer sb)方法用法解析及教程输出异常问题咨询
解决appendTail()导致重复输出的问题
嘿,我太懂你这种困惑了——之前用appendReplacement()和appendTail()的时候也踩过一模一样的坑,才会输出-foo-foo-foo-这种重复的结果!
先给你掰扯清楚这俩方法的核心协作逻辑,别被文档的官方话术绕晕:
appendReplacement(StringBuffer sb, String replacement):每次匹配到目标内容时,它会把当前匹配位置之前还没处理的文本加上替换后的内容塞进sb,同时把匹配器的指针移到当前匹配的末尾,方便下一次查找。appendTail(StringBuffer sb):这纯粹是个收尾动作!等所有匹配都处理完了,它会把最后剩下的、没被匹配到的文本追加到sb里,这个方法只需要调用一次就够了!
给你看个典型的错误写法(应该就是你现在的代码):
Pattern pattern = Pattern.compile("foo"); Matcher matcher = pattern.matcher("-foo-"); StringBuffer sb = new StringBuffer(); while (matcher.find()) { matcher.appendReplacement(sb, "foo"); // 坑就在这!循环里调用appendTail,每次都把剩余文本追加一遍 matcher.appendTail(sb); } System.out.println(sb.toString()); // 输出:-foo-foo-foo-
正确的用法应该是这样:
把appendTail()移到循环外面,只执行一次收尾操作:
Pattern pattern = Pattern.compile("foo"); Matcher matcher = pattern.matcher("-foo-"); StringBuffer sb = new StringBuffer(); while (matcher.find()) { matcher.appendReplacement(sb, "foo"); } // 所有匹配处理完成后,再追加剩余的未匹配内容 matcher.appendTail(sb); System.out.println(sb.toString()); // 输出:-foo-
关键注意点总结:
- 绝对不要在
while(matcher.find())循环内部调用appendTail(),否则剩余文本会被多次追加,导致重复输出。 appendTail()是一次性收尾操作,必须放在所有appendReplacement()调用完成后执行。- 每次
appendReplacement()都会自动更新匹配器的位置,确保下一次find()从正确的位置开始查找。
内容的提问来源于stack exchange,提问作者Hamza Belmellouki
相关产品推荐
相关产品推荐

