如何将 Java ArrayList 中的字符串按固定长度(两字符)分割为子串
发布时间 - 2026-01-30 00:00:00 点击率:次本文介绍使用正则表达式 `split("(?
在自然语言处理或自定义词法解析器(如 Tokenizer 类)中,常需将单词按固定粒度(如双字母组)进行切分。题目要求:对 Reader 类中筛选出的大写英文单词(如 "TEACHER" → "Te", "ac", "her"),无论原始字符串长度为奇数或偶数,均严格拆分为三段,每段尽可能为两个字符,剩余字符归入最后一段。例如:
- "TEACHER"(7 字符,奇数)→ ["TE", "AC", "HER"]
- "CATTLE"(6 字符,偶数)→ ["CA", "TT", "LE"]
该需求本质上是「每 2 个字符切一刀,但只切两刀,形成三段」,而非简单等长分片。Java 中最简洁、健壮的实现方式是使用 正则表达式的边界匹配,而非手动计算索引或循环拼接。
✅ 推荐方案:正则 split() 配合 \G 锚点
核心正则表达式:
str.split("(?<=\\G..)(?=..)")- (?正向后查找(lookbehind):匹配位置前必须紧邻「上一次匹配结束处(\G)之后的两个字符」;
- (?=..) 是正向前查找(lookahead):匹配位置后必须至少还有两个字符;
- 二者共同作用,在每两个字符之后、且后面仍有字符时“插入分割点”,从而自然实现「两两分组」,且自动兼容奇偶长度——末尾剩余 1 或 2 字符均保留在最后一段。
? 注意:\G 表示上一匹配的结束位置(或字符串开头),配合 .. 确保每次匹配都从上一轮切分后的位置继续推进,避免重叠或遗漏。
? 完整可运行示例(整合 Reader + Tokenizer)
首先修正原代码中的关键问题:
- Tokenizer 中未导入 java.util.Arrays,导致 Arrays.toString() 报错;
- 原 splitString() 方法错误地对每个字符串调用 Arrays.toString(),得到的是 [T, e, a, c, h, e, r] 这类单字符数组字符串,而非目标双字母组;
- 应对每个字符串单独 split(),再将结果 String[] 存入列表(如 List
)或展平为 List 。
以下是优化后的 Tokenizer.splitString() 实现:
import java.util.*;
import java.util.stream.Collectors;
public class Tokenizer {
private final Reader rd = new Reader();
public List splitString() {
List words = rd.getWord(); // 获取大写单词列表,如 ["PRINTER", "AIRPORT", ...]
return words.stream()
.map(word -> word.split("(?<=
\\G..)(?=..)")) // 每词拆为 String[]
.collect(Collectors.toList());
}
// 若需扁平化为单层字符串列表(所有子串合并):
public List splitAndFlatten() {
List words = rd.getWord();
return words.stream()
.flatMap(word -> Arrays.stream(word.split("(?<=\\G..)(?=..)")))
.collect(Collectors.toList());
}
} 调用并验证输出:
public class Main {
public static void main(String[] args) {
Tokenizer tokenizer = new Tokenizer();
List result = tokenizer.splitString();
for (String[] parts : result) {
System.out.println(Arrays.toString(parts));
}
}
} 输出结果:
[PR, IN, TER] [AI, RP, ORT] [PA, IN, TER] [LE, TT, ER] [VE, HI, CLE] [TE, AC, HER]
✅ 完全符合题目要求:"TER"(3 字)、"ORT"(3 字)、"CLE"(3 字)、"HER"(3 字)均为末段保留余数;偶数长词如 "LETT" → "LE", "TT", "ER"(注意原 "Letter" 经 toUpperCase() 后为 "LETTER",长度 6 → "LE", "TT", "ER")。
⚠️ 注意事项与最佳实践
- 不要在循环中反复创建 Reader 实例:当前设计中 Tokenizer 每次调用都新建 Reader,虽无错但低效。建议通过构造函数注入或使用单例模式。
- 空字符串与边界长度需防御:若输入字符串长度
- 性能考量:正则 split() 在大数据量下略慢于 substring() 手动切分,但代码可读性与维护性显著更高。万级以下单词处理无需优化。
- 区分大小写:Reader.wordCheck() 已调用 .toUpperCase(),故切分基于大写字符串,符合示例输出风格。
✅ 总结
使用 str.split("(?
# java
# 正则表达式
# 字符串
# 切分
# 而非
# 三段
# 的是
# 自然语言
# 均为
# 上一
# 这类
# 更高
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何打造高效商业网站?建站目的决定转化率
如何注册花生壳免费域名并搭建个人网站?
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
实例解析Array和String方法
三星网站视频制作教程下载,三星w23网页如何全屏?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
如何快速生成专业多端适配建站电话?
如何快速搭建二级域名独立网站?
青岛网站建设如何选择本地服务器?
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
JavaScript实现Fly Bird小游戏
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
Thinkphp 中 distinct 的用法解析
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
做企业网站制作流程,企业网站制作基本流程有哪些?
iOS UIView常见属性方法小结
如何在IIS7上新建站点并设置安全权限?
php 三元运算符实例详细介绍
如何在Tomcat中配置并部署网站项目?
LinuxCD持续部署教程_自动发布与回滚机制
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】
Python制作简易注册登录系统
Laravel storage目录权限问题_Laravel文件写入权限设置
微信小程序制作网站有哪些,微信小程序需要做网站吗?
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
如何获取免费开源的自助建站系统源码?
如何基于PHP生成高效IDC网络公司建站源码?
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
QQ浏览器网页版登录入口 个人中心在线进入
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
如何在万网ECS上快速搭建专属网站?
如何用虚拟主机快速搭建网站?详细步骤解析
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
LinuxShell函数封装方法_脚本复用设计思路【教程】
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】
JS弹性运动实现方法分析
Laravel观察者模式如何使用_Laravel Model Observer配置


