
本文介绍如何使用正则表达式将 arraylist 中每个字符串精确拆分为长度为 2 的子串(末尾不足 2 个字符时保留原样),并适配奇偶长度字符串的统一三段式分割逻辑。
在 Java 中,若需将字符串按固定宽度(如每 2 个字符)进行“非破坏性”切分(即不丢失末尾剩余字符),推荐使用基于 String.split() 的零宽断言正则表达式:"(?
例如:
- "teacher"(7 字符,奇数)→ ["te", "ac", "her"]
- "cattle"(6 字符,偶数)→ ["ca", "tt", "le"]
注意:此正则不依赖字符串总长度奇偶判断,而是通过断言逻辑自动适配任意长度,天然满足题设要求。
✅ 正确实现方式(Tokenizer 类修正版)
import java.util.*;
import java.util.stream.Collectors;
public class Tokenizer {
private final Reader rd = new Reader();
public List> splitString() {
List wordList = rd.getWord(); // 获取大写后的单词列表
List> result = new ArrayList<>();
for (String word : wordList) {
// 使用正则按每2字符切分(支持任意长度)
String[] parts = word.split("(?<=\\G..)(?=..)");
result.add(Arrays.asList(parts));
}
// 打印验证结果
result.forEach(parts -> System.out.println(parts));
return result;
}
}
? 关键点说明
- \\G 表示“上一次匹配的结束位置”,首次匹配时等价于字符串开头;
- (?正向后瞻:要求当前位置前恰好有 2 个字符,且这 2 字符紧接在上一次匹配之后;
- (?=..) 是正向前瞻:要求当前位置后至少还有 2 个字符;
- 二者组合形成“在每两个字符之后、且后面还有至少两个字符的位置”进行分割,因此:
- "Printer"(7 字)→ 在索引 2 后("Pr"后)、4 后("in"后)分割 → ["Pr","in","ter"]
- "Teacher"(7 字)→ ["Te","ac","her"]
- "Letter"(6 字)→ ["Le","tt","er"]
⚠️ 注意事项
- 原代码中 Arrays.toString(...) 会生成带 [ ] 和逗号的字符串(如 "[te, ac, her]"),不应直接存入 SplList —— 应存储 List
或 String[] 结构以保持可操作性; - split() 对空字符串或长度 wordList[i].length() > 4 已过滤,无需额外校验;
- 若需强制三段输出(即使长度
✅ 推荐进阶写法(Stream + 函数式)
public List> splitStringFunctional() { return rd.getWord().stream() .map(s -> Arrays.asList(s.split("(?<=\\G..)(?=..)"))) .collect(Collectors.toList()); }
该方案简洁、不可变、线程友好,符合现代 Java 实践规范。
立即学习“Java免费学习笔记(深入)”;
综上,使用 "(?










