
本文详解如何在 Java 中正确使用正则表达式匹配并删除文本中每一行的首字符,重点解决 ^ 锚点默认不跨行生效的问题,通过启用 Pattern.MULTILINE 模式实现逐行处理。
本文详解如何在 java 中正确使用正则表达式匹配并删除文本中每一行的首字符,重点解决 `^` 锚点默认不跨行生效的问题,通过启用 `pattern.multiline` 模式实现逐行处理。
在 Java 中,正则表达式 ^. 本意是“匹配每行开头的任意一个字符”,但默认情况下 ^ 仅匹配整个输入字符串的开头,而非每行开头。这就是为何原始代码中只有第一行的首字符被移除,而后续行未受影响——因为 String.replaceAll() 使用的是 单行模式(DOTALL 默认关闭,MULTILINE 默认关闭)。
要让 ^ 真正作用于每一行的起始位置,必须启用 多行模式(Multiline Mode)。Java 提供两种等效方式:
✅ 正确做法:启用 MULTILINE 标志
方法一:使用 Pattern.compile() 配合 Matcher
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class RemoveFirstCharPerLine {
public static void main(String[] args) {
String inString = "Z302052023CFCL11 0000.000000000 249999.990 0999999990000.000000000 0000.000000000 0000.000000000 0000.000000000\n" +
"Z302052023CFCL11 0000.000000000 249999.990 0999999990000.000000000 0000.000000000 0000.000000000 0000.000000000";
// 启用 MULTILINE 模式,使 ^ 匹配每行开头
Pattern pattern = Pattern.compile("^.", Pattern.MULTILINE);
String result = pattern.matcher(inString).replaceAll("");
System.out.println(result);
/* 输出:
302052023CFCL11 0000.000000000 249999.990 0999999990000.000000000 0000.000000000 0000.000000000 0000.000000000
302052023CFCL11 0000.000000000 249999.990 0999999990000.000000000 0000.000000000 0000.000000000 0000.000000000
*/
}
}方法二:使用内联标志 (?m)(推荐,更简洁)
String result = inString.replaceAll("(?m)^.", "");(?m) 是正则表达式的内联标志,等价于 Pattern.MULTILINE,可直接嵌入模式字符串,无需额外编译。
⚠️ 注意:String.replaceAll(String regex, String replacement) 内部不自动启用 MULTILINE,因此 inString.replaceAll("^.", "") 无效——它只替换字符串最开头的字符(即第一个 Z),其余 ^ 不匹配任何位置。
立即学习“Java免费学习笔记(深入)”;
? 补充说明:^ 与 $ 在 MULTILINE 下的行为
- ^ → 匹配行首(换行符 \n、\r\n 或字符串开头之后的位置)
- $ → 匹配行尾(换行符之前或字符串结尾前的位置)
- 换行符本身不被消耗,仅作为锚点边界参考。
✅ 验证每行首字符是否被成功捕获(调试用)
若需先查看哪些字符将被移除,可用 find() 提取:
Pattern p = Pattern.compile("^.", Pattern.MULTILINE);
Matcher m = p.matcher(inString);
while (m.find()) {
System.out.print("'" + m.group() + "' "); // 输出: 'Z' 'Z'
}
System.out.println();? 总结
- ❌ 错误:str.replaceAll("^.", "") —— 仅处理首行开头
- ✅ 正确:str.replaceAll("(?m)^.", "") 或 Pattern.compile("^.", MULTILINE).matcher(str).replaceAll("")
- 关键点:^ 的行为依赖正则模式标志;多行文本处理必须显式启用 MULTILINE
- 扩展提示:如需保留空行(避免因空行导致 ^. 匹配失败),该方案天然兼容——空行的 ^. 会匹配其开头的换行符后位置(即空字符前),但由于无字符可匹配,实际不触发替换,结果保持空行不变。
掌握此模式,即可安全、高效地对多行文本执行逐行首/尾字符操作,广泛适用于日志清洗、格式标准化及文本预处理场景。


















