You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中String.split()正则分割失效问题求助

Android下正则分割字符串失效的解决思路

你遇到的问题核心在于Android平台的正则表达式引擎(早期版本基于ICU实现)和标准Java SE的引擎对\G锚点在lookbehind中的处理存在兼容性差异。(?<=\\G.{2})这种写法在Java SE中能正确按每2个字符分割,但在部分Android版本里无法正确延续匹配位置,导致只分割出第一个元素后,剩余内容全部被当作单个元素返回。

下面提供几种可靠的解决方法:

方法1:使用Matcher提取固定长度子串

这种方法通过主动匹配每2个字符的方式收集结果,兼容性更强,不受正则引擎差异影响:

String s = "00JS1B4BJG2C2G3S6C6S5CHG1C4CKS3C1G5S6B3G7BHB7G6G5B";
String targetStr = s.substring(2);
Pattern twoCharPattern = Pattern.compile(".{2}");
Matcher matcher = twoCharPattern.matcher(targetStr);

List<String> resultList = new ArrayList<>();
while (matcher.find()) {
    resultList.add(matcher.group());
}

// 转换为数组
String[] result = resultList.toArray(new String[0]);

方法2:手动循环分割(推荐,无正则依赖)

完全脱离正则引擎,直接通过字符串截取实现,兼容性拉满,执行效率也更高:

String s = "00JS1B4BJG2C2G3S6C6S5CHG1C4CKS3C1G5S6B3G7BHB7G6G5B";
String targetStr = s.substring(2);
int strLength = targetStr.length();

List<String> resultList = new ArrayList<>();
for (int i = 0; i < strLength; i += 2) {
    // 兼容字符串长度为奇数的情况(如果存在)
    int endIndex = Math.min(i + 2, strLength);
    resultList.add(targetStr.substring(i, endIndex));
}

String[] result = resultList.toArray(new String[0]);

方法3:高版本Android适配(不推荐)

如果你的应用仅需适配Android 7.0(API Level 24)及以上版本,部分设备可能已经支持原正则写法。但从兼容性角度考虑,前两种方法的通用性更强。

内容的提问来源于stack exchange,提问作者Fr4ncx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:48:53