StringBuilder本身不支持正则,需先转String再用Pattern+Matcher处理,逐行匹配替换后用append累加,appendReplacement支持动态逻辑,避免频繁toString。

Java 中 StringBuilder 本身不支持正则匹配或替换,它只是可变字符串容器;真正做正则匹配和动态替换的是 String 或 Matcher + Pattern。但你可以用 StringBuilder 高效拼接处理后的每一行——关键在于:先按行拆分、逐行正则处理、再用 StringBuilder 累加结果。
用 Pattern + Matcher 逐行匹配并替换
不要试图直接对 StringBuilder 调用正则方法(它没有)。正确做法是把内容转成 String,用 Pattern 编译规则,用 Matcher 扫描每行(或整个文本),提取/替换后写回 StringBuilder。
- 若需“按行处理”,先用
split(" ")或lines()(Java 11+)获取每行 - 对每行调用
Pattern.compile("...").matcher(line).replaceAll(...)或更灵活地用find()+appendReplacement() - 将处理后的行用
sb.append(处理后的内容).append(" ")累加
用 appendReplacement 实现动态逻辑替换
当替换值依赖匹配内容(比如把数字加 10、把邮箱脱敏),Matcher.appendReplacement() 是最灵活的方式——它允许你在匹配时执行任意 Java 代码,再决定替换什么。
- 创建
StringBuilder result = new StringBuilder() - 用
Pattern.compile(regex).matcher(originalString)获取 matcher - 循环
matcher.find(),在循环体内解析matcher.group(),计算新值,调用matcher.appendReplacement(result, newValue) - 最后调用
matcher.appendTail(result)补上未匹配部分
避免常见坑:别在循环中反复 toString()
有人习惯每处理一行就 sb.toString().replaceAll(...),这会频繁创建新 String 对象,失去 StringBuilder 的性能优势。
立即学习“Java免费学习笔记(深入)”;
- ❌ 错误:每次
sb.toString().replaceAll(...)→ 每次都新建 String + 正则引擎开销 - ✅ 正确:只对原始字符串做一次正则扫描,或逐行处理时仅对当前行 String 操作,再 append 到 StringBuilder
- 如果原始文本很大且只需改部分行,优先用
lines().map(...).collect(Collectors.joining(" "))(Java 8+),比手动 StringBuilder 更简洁
一个实用示例:提取 IP 并脱敏后拼接
比如日志文本中每行含 IP,想把每个 IP 替换为 "***.***.***.xxx",同时保留其余内容不变:
String log = "INFO [192.168.1.100] login success
WARN [10.0.0.5] timeout";
StringBuilder sb = new StringBuilder();
Pattern ipPattern = Pattern.compile("\b(?:\d{1,3}\.){3}\d{1,3}\b");
Matcher m = ipPattern.matcher(log);
while (m.find()) {
String ip = m.group();
String[] parts = ip.split("\.");
String masked = "***.***.***." + parts[3];
m.appendReplacement(sb, masked);
}
m.appendTail(sb); // 追加剩余未匹配部分
// sb.toString() 就是处理后的结果


















