如何将 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配置