
本文介绍如何在 Java 中通过正则表达式将字符串按空白字符(含空格、制表符、换行符等)分割,同时完整保留所有分隔符作为独立元素,避免换行符被当作普通空白符丢失其语义。
本文介绍如何在 java 中通过正则表达式将字符串按空白字符(含空格、制表符、换行符等)分割,同时**完整保留所有分隔符作为独立元素**,避免换行符被当作普通空白符丢失其语义。
在 Java 字符串处理中,String.split() 方法虽便捷,但其设计目标是丢弃分隔符,仅返回分割后的非分隔符内容;即使启用 split("(?
更可靠且语义清晰的方案是:不使用 split(),而改用 Pattern + Matcher 进行主动匹配,将输入文本视为两类原子单元的交替序列——
- S+:一个或多个非空白字符(即“词”);
- s+:一个或多个空白字符(含空格、 、 、 等,且连续空白会被整体捕获为单个元素)。
二者用 |(或逻辑)组合为 \S+|\s+,即可实现精准分词与分隔符并存的 Tokenization。
以下是完整可运行示例:
立即学习“Java免费学习笔记(深入)”;
import java.util.*;
import java.util.regex.*;
public class TokenizeWithDelimiters {
public static List<String> tokenizePreservingDelimiters(String input) {
if (input == null) return Collections.emptyList();
Pattern pattern = Pattern.compile("\S+|\s+");
Matcher matcher = pattern.matcher(input);
List<String> tokens = new ArrayList<>();
while (matcher.find()) {
tokens.add(matcher.group());
}
return tokens;
}
public static void main(String[] args) {
String text = "word1 word2! word3? word4; word5, word6
word7
!word8! word9 word10 word11 word12";
List<String> result = tokenizePreservingDelimiters(text);
System.out.println(result);
// 输出示例(注意:
在列表中为真实换行符,打印时可见):
// [word1, " ", word2!, " ", word3?, " ", word4;, " ", word5,, " ", word6, "
", word7, "
", !word8!, " ", word9, ...]
}
}✅ 关键优势:
- 换行符 被独立捕获为长度为 1 的字符串(而非被 \s 吞并为不可见空格);
- 连续空白(如 " ")会作为一个整体 token 返回,保持原始结构;
- 无需手动拼接或后处理,结果列表天然保持原始顺序与边界信息。
⚠️ 注意事项:
- 若需进一步区分不同空白类型(如单独提取 而非所有 s+),可细化正则为 \S+|\r\n|\n|\r|\t|(注意空格字面量);
- \s 在 Java 字符串中需双写反斜杠,即 \s,切勿写作 s(编译错误);
- 此方法适用于中等长度文本;对超长文本或高频调用场景,建议复用 Pattern.compile(...) 实例以提升性能。
该方案广泛应用于日志解析、协议报文拆解、模板引擎词法分析等需保真还原原始格式结构的场景,是比 split() 更底层、更可控的文本切分范式。


















