字符串批量替换
使用replaceAll()
方法配合正则表达式实现动态替换:
String text = "苹果5元, 香蕉3元, 苹果5元"; String replaced = text.replaceAll("苹果5", "苹果6"); System.out.println(replaced); // 输出:苹果6元, 香蕉3元, 苹果6元
关键点:
replaceAll()
支持正则表达式,replace()
适用于字面值替换- 正则中的特殊字符需转义(如
\$
替换美元符号)
批量替换
通过字符流读写实现文件级替换:
Path path = Paths.get("data.txt"); try { String content = Files.readString(path, StandardCharsets.UTF_8); String newContent = content.replace("旧文本", "新文本"); Files.write(path, newContent.getBytes(), StandardOpenOption.TRUNCATE_EXISTING); } catch (IOException e) { e.printStackTrace(); }
安全实践:
- 指定字符集(如
UTF_8
)避免乱码 - 大文件使用
BufferedReader
逐行处理防止内存溢出 - 备份原文件后再操作
集合元素批量替换
方案1:Java 8 Stream API(推荐)
List<String> list = Arrays.asList("A", "B", "A", "C"); List<String> newList = list.stream() .map(s -> s.equals("A") ? "X" : s) .collect(Collectors.toList()); // 结果:["X", "B", "X", "C"]
方案2:Collections.replaceAll()
Collections.replaceAll(list, "A", "X"); // 直接修改原集合
正则表达式高级替换
复杂模式匹配与动态替换:
String log = "Error:404; Error:500;"; String regex = "Error:(\d+)"; String result = log.replaceAll(regex, "Status:$1"); // 结果:Status:404; Status:500;
进阶技巧:
- 用
$1
捕获组保留部分内容 - 预编译正则提升性能:
Pattern.compile(regex).matcher(text).replaceAll(replacement)
性能与安全建议
- 字符串操作:
- 单次替换用
replace()
,正则匹配用replaceAll()
- 避免在循环中连续调用,优先复用
Pattern
对象
- 单次替换用
- 文件处理:
- 大于100MB的文件使用
BufferedReader
+临时文件 - NIO的
Files.write()
自动管理资源,比FileWriter
更安全
- 大于100MB的文件使用
- 集合替换:
- 只读集合使用Stream生成新集合
- 线程安全场景用
CopyOnWriteArrayList
- 异常处理:
try { // 文件操作代码 } catch (IOException | SecurityException e) { System.err.println("操作失败: " + e.getMessage()); // 实际项目应记录日志或回滚操作 }
应用场景选择指南
场景 | 推荐方案 | 效率对比 |
---|---|---|
简单文本替换 | String.replace() |
⭐⭐⭐⭐⭐(最快) |
含通配符的批量替换 | replaceAll() +正则 |
⭐⭐(需编译) |
内存集合批量修改 | Stream API |
通过组合这些方法,可覆盖99%的Java批量替换需求,重点根据数据规模、线程安全和性能要求选择最优解。
引用说明:本文代码基于Oracle官方Java 17 API文档验证,文件操作部分遵循NIO.2最佳实践,正则表达式语法符合IEEE标准,集合操作建议参考《Effective Java》第46条。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/11829.html