
本文介绍如何使用正则表达式将 arraylist 中每个字符串精确拆分为长度为 2 的子串(末尾不足 2 个字符时保留原样),并适配奇偶长度字符串的统一三段式分割逻辑。
在 Java 中,若需将字符串按固定宽度(如每 2 个字符)进行“非破坏性”切分(即不丢失末尾剩余字符),推荐使用基于 String.split() 的零宽断言正则表达式:"(?<=\G..)(?=..)"。该表达式利用 \G(上一次匹配结束位置)与前后瞻(lookaround)确保每次切割都严格从上一匹配末尾开始,并确认后续仍有至少两个字符——从而自然实现“两两分组,余数归尾”的效果。
例如:
- "teacher"(7 字符,奇数)→ ["te", "ac", "her"]
- "cattle"(6 字符,偶数)→ ["ca", "tt", "le"]
注意:此正则不依赖字符串总长度奇偶判断,而是通过断言逻辑自动适配任意长度,天然满足题设要求。
Word报告自动生成神器。自动生成专业Word文档报告,支持模板填充、目录生成、表格/图表插入、页眉页脚、多级标题、样式主题、批量邮件合并。当用户需要生成Word报告、创建合同文档、批量生成通知/证书、填充Word模板、制作商业计划书时触发。
✅ 正确实现方式(Tokenizer 类修正版)
import java.util.*;
import java.util.stream.Collectors;
public class Tokenizer {
private final Reader rd = new Reader();
public List<List<String>> splitString() {
List<String> wordList = rd.getWord(); // 获取大写后的单词列表
List<List<String>> 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 表示“上一次匹配的结束位置”,首次匹配时等价于字符串开头;
- (?<=\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> 或 String[] 结构以保持可操作性;
- split() 对空字符串或长度 < 2 的字符串返回 {""} 或 {},但本例中 wordList[i].length() > 4 已过滤,无需额外校验;
- 若需强制三段输出(即使长度 < 6),应改用手动截取逻辑(如 substring(0,2)/substring(2,4)/substring(4)),但题设示例表明“自然分组”即可满足需求。
✅ 推荐进阶写法(Stream + 函数式)
public List<List<String>> splitStringFunctional() {
return rd.getWord().stream()
.map(s -> Arrays.asList(s.split("(?<=\G..)(?=..)")))
.collect(Collectors.toList());
}该方案简洁、不可变、线程友好,符合现代 Java 实践规范。
立即学习“Java免费学习笔记(深入)”;
综上,使用 "(?<=\G..)(?=..)" 是解决此类“等宽分组+余数保留”问题最优雅、高效且可读性强的标准方案。

















